ejecutando imagemgick convert (aplicación de consola) desde python

Estoy tratando de rasterizar algunas fonts usando imagemgick con este comando que funciona bien desde una terminal:

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 

Ejecutar el mismo comando usando subproceso para automatizarlo no funciona:

 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' 

Lo descubrí: resulta que Windows tiene su propio progtwig convert.exe en PATH .

El siguiente código imprime 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) 

Ejecutar el mismo código en un terminal muestra que convert imagemgick se convert en convert Windows:

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

.

No reinicié Python después de instalar ImageMagick, por lo que su PATH aún apuntaba a la versión de Windows.

Usando el camino completo funciona:

 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)