2

Я пытаюсь растеризация некоторых шрифтов с помощью ImageMagick с этой командой, которая отлично работает с терминала:работает ImageMagick конвертировать (консольное приложение) из питона

convert -size 30x40 xc:white -fill white -fill black -font "fonts\Helvetica Regular.ttf" -pointsize 40 -gravity South -draw "text 0,0 'O'" draw_text.gif 

выполняющего ту же команду, используя подпроцесс для автоматизации его не работает :

try: 
    cmd= ['convert','-size','30x40','xc:white','-fill','white','-fill','black','-font','fonts\Helvetica Regular.ttf','-pointsize','40','-gravity','South','-draw',"text 0,0 'O'",'draw_text.gif'] 
    #print(cmd) 
    subprocess.check_output(cmd,shell=True,stderr=subprocess.STDOUT) 
except CalledProcessError as e: 
    print(e) 
    print(e.output) 

.

Command '['convert', '-size', '30x40', 'xc:white-fill', 'white', '-fill', 'black', '-font', 'fonts\\Helvetica Regular.ttf', '-pointsize', '40', '-gravity', 'South', '-draw', "text 0,0 'O'", 'draw_text.gif']' returned non-zero exit status 4 
b'Invalid Parameter - 30x40\r\n' 
+0

Почему вы используете его с 'SHELL = true'? – gahooa

+0

@gahooa По какой-то причине я никогда не мог запускать что-либо без 'shell = True'. Я попробовал это с помощью 'shell = False', но это дает мне ту же ошибку. Во всяком случае, это небезопасно, потому что я не использую какой-либо недоверенный ввод. – Navin

+1

Для начала возьмите 'str.join ('', cmd)' и скопируйте + вставьте его в командную строку, чтобы увидеть, все ли работает. – gahooa

ответ

8

Я понял это: Оказывается, что окно имеет свою собственную convert.exe программы в PATH.

Следующий код печатает b'C:\\Windows\\System32\\convert.exe\r\n':

try: 
    print(subprocess.check_output(["where",'convert'],stderr=subprocess.STDOUT,shell=True)) 
except CalledProcessError as e: 
    print(e) 
    print(e.output) 

Запуск и тот же код в терминале показывает, что ImageMagick в convert тени для Windows' convert:

C:\Users\Navin>where convert              
C:\Program Files\ImageMagick-6.8.3-Q16\convert.exe        
C:\Windows\System32\convert.exe             

.

Я не перезапустил python после установки ImageMagick, поэтому его PATH все еще указал на версию Windows.

Используя полный путь работы:

try: 
    cmd= ['C:\Program Files\ImageMagick-6.8.3-Q16\convert','-size','30x40','xc:white','-fill','white','-fill','black','-font','fonts\Helvetica Regular.ttf','-pointsize','40','-gravity','South','-draw',"text 0,0 'P'",'draw_text.gif'] 
    print(str.join(' ', cmd)) 
    print('stdout: {}'.format(subprocess.check_output(cmd,shell=True,stderr=subprocess.STDOUT))) 
except CalledProcessError as e: 
    print(e) 
    print(e.output) 
+0

Я не знаю, почему, но в OSX (10.11) работает только без оболочки = True , –

+0

@ AndréDuarte Да, я сделал то же самое 4 года назад, когда задал этот вопрос. Хотя с тех пор я понял, что ImageMagick - это кусок дерьма, и я бы скорее использовал библиотеку изображений с реальным API. – Navin