如何将参数值传递给Popen?

2 投票
3 回答
10612 浏览
提问于 2025-04-16 22:27

在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.pngout-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')

撰写回答