LINUX.ORG.RU

inkscape --shell дохнет

 , ,


0

2

Есть такой код:

print("svg_samples_list:\n" + str(svg_samples_list) + '\n')

ink_proc = subprocess.Popen(['inkscape', '--shell'],
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE)

def get_data_about_svgfile (svgfile):
    o = ink_proc.communicate("-S " + svgfile + "\n")
    print(svgfile + ":\n" + o[0] + "\n")

map(get_data_about_svgfile, svg_samples_list)

ink_proc.communicate("quit\n")

работа скрипта:

$ python2 generate-bitmap-samples.py 
svg_samples_list:
[u'./tmp/star0.svg', u'./tmp/star0.rot.svg', u'./tmp/star0.rot_ref.svg', u'./tmp/star0.rot_ref_flat.svg']

./tmp/star0.svg:
Inkscape 0.91 r13725 interactive shell mode. Type 'quit' to quit.
>svg2,48.365724,-1282.3207,158.90038,152.83165
layer1,48.365724,-1282.3207,158.90038,152.83165
path3336,48.365724,-1282.3207,158.90038,152.83165
>

Traceback (most recent call last):
  File "generate-bitmap-samples.py", line 100, in <module>
    map(get_data_about_svgfile, svg_samples_list)
  File "generate-bitmap-samples.py", line 97, in get_data_about_svgfile
    o = ink_proc.communicate("-S " + svgfile + "\n")
  File "/usr/lib/python2.7/subprocess.py", line 799, in communicate
    return self._communicate(input)
  File "/usr/lib/python2.7/subprocess.py", line 1404, in _communicate
    self.stdin.flush()
ValueError: I/O operation on closed file

Нужна помощь в работе с внешними процессами, короче.

★★★★★

Это довольно неинтуитивно, но Popen.communicate позволяет отправить данные ровно один раз и потом ожидает смерти процесса. Сам так недавно порвался.

Deleted ()
import subprocess as sp

class InkComm:
    def __init__(self):
        "Open unbuffered pipe to Inkscape shell in text mode"
        self.p = sp.Popen(['inkscape', '--shell'], 
                           bufsize=0, universal_newlines=True,
                           stdin=sp.PIPE, stdout=sp.PIPE)

    def read(self):
        "Read from open Inkscape shell till '>' occur"
        rv = ''
        while True:
            r = self.p.stdout.read(1)
            if r == '>':
                break
            rv += r
        return rv

    def write(self, words_of_wisdom):
        "Write data and newline char"
        return self.p.stdin.write(words_of_wisdom + '\n')
    
    def close(self):
        "Guess what this method does"
        stdout, stderr = self.p.communicate('quit\n')
        return self.p.returncode, stdout, stderr



files = ['drawing.svg']*3   # same file 3 times in a row

ink = InkComm()
ink.read()                  # 'Inkscape 0.91 blablabla...'

for f in files:
    print('-> %s' % f)
    ink.write('-S %s' % f)
    print(ink.read())

ink.close()

На третьем питоне это работает.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.