【问题标题】:running imagemagick convert (console application) from python从 python 运行 imagemagick convert(控制台应用程序)
【发布时间】:2013-02-07 15:29:35
【问题描述】:

我正在尝试使用 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'

【问题讨论】:

  • 你为什么用shell = True运行它?
  • @gahooa 出于某种原因,没有shell=True,我永远无法运行任何东西。我用shell=False 尝试过,但这给了我同样的错误。无论如何,这不是不安全的,因为我没有使用任何不受信任的输入。
  • 对于初学者,请使用 str.join(' ', cmd) 并将其复制并粘贴到命令行,看看它是否仍然有效。
  • @gahooa 如果我引用fonts\Helve...text 0,0 'O',那就可以了。我认为这是正常的,因为引号只是因为参数中的空格而存在,并且 shell 在将它们传递给程序之前会去掉引号

标签: python python-3.x imagemagick subprocess imagemagick-convert


【解决方案1】:

我想通了:原来windows在PATH有自己的convert.exe程序

以下代码打印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                                                 

.

安装 ImageMagick 后我没有重新启动 python,所以它的 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)

【讨论】:

  • 我不知道为什么,但在 OSX(10.11) 中只能在没有 shell=True 的情况下工作。
  • @AndréDuarte 是的,4 年前当我问这个问题时,我做了同样的事情。虽然从那以后,我意识到 ImageMagick 是一个垃圾,我更愿意使用带有真正 API 的图像库。
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多