如何将参数值传递给Popen?
在Python控制台里,这个命令可以正常工作:
convert -quality 100 in.pdf out.png
但是当我把这个命令加到我的Python脚本里,像这样:
Popen(['convert', '-quality 100', 'in.pdf', 'out.png'])
我就遇到了:
unrecognized option `-quality 100'
如果我把那个参数改成 '-quality=100'
,我还是会遇到错误。
我尝试这样修复它:
Popen(['convert', '-quality', '100', 'in.pdf', 'out.png'])
这个方法可以运行,但没有生成 out.png
文件。
更新:最后的版本可以正常工作。我可能最开始输入错了。
3 个回答
1
在脚本运行的时候,必须能找到convert
这个命令。你能在参数里加上convert
的完整路径吗?
Popen(['/path/to/convert', '-quality', '100', 'in.pdf', 'out.png'])
把'/path/to/convert'换成实际的路径。另外,你还需要确保执行这个脚本的账户在当前目录里有读和写的权限。
2
这个方法很好用:
#! /usr/bin/python3.2
from subprocess import Popen
Popen ( ['convert', '-quality', '100', 'test.pdf', 'out.png'] )
使用
Version: ImageMagick 6.6.2-6 2011-03-16 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2010 ImageMagick Studio LLC
Features: OpenMP
你确定这个脚本能找到你的 in.pdf 文件吗?
5
每个参数都会有自己单独的列表元素,所以第二种写法是正确的。
你要记住,在调用 communicate
完成之前,命令可能还在运行(不过在你的情况下,这种可能性不大)。在调用 communicate 之后,检查 returncode
来看看程序是否遇到了错误(比如说,PDF 文件格式不对之类的)。
另外,imagemagick 的 convert 命令会把多页的 PDF 文件转换成多个 PNG 文件(比如 out-0.png
和 out-1.png
)。你可以检查一下这些文件是否存在。使用 -append
选项可以避免这种情况。
import subprocess
Popen = subprocess.Popen
s = Popen(['convert', '-quality', '100', 'in.pdf', '-append', 'out.png'])
s.communicate()
if s.returncode != 0:
raise OSError('convert error')