2011-07-28 72 views
1

从Python控制台这个作品:如何将参数值传递给Popen?

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

更新:最新版本正在工作。我最初一定错了。

+1

你最后的例子应该工作,它是否提供任何输出? – utdemir

+1

是的,它现在正在工作。我一定错过了第一次。 – ram1

+0

@ryaz:“最后的版本正在工作”。要么回答你自己的问题(没关系)或者关闭问题。 –

回答

4

每个参数都有它自己的列表元素,所以第二个变体是正确的。

您应该记住,直到呼叫communicate完成,命令仍然可以运行(尽管这不太可能)。调用通信后检查returncode以确定程序是否遇到任何错误(如格式错误的PDF文件等)。

此外,imagemagick转换将多页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') 
1

脚本运行时必须在执行路径中找到convert命令。你可以在参数中包含convert的完整路径吗?

Popen(['/path/to/convert', '-quality', '100', 'in.pdf', 'out.png']) 

用真实路径替换'/ path/to/convert'。此外,您需要确保执行该脚本的帐户在当前目录中具有读写权限。

+0

我认为硬编码转换的参考不是一个好主意。希望这些二进制文件将在路径中,否则该程序将无法在不同的系统上工作。 – Whoopska

+0

@Whoopska:尽管“希望”,如果二进制文件不在路径中,代码将不会成功执行。理想情况是a)在尝试执行命令之前确定命令是否存在,或者b)将路径置于配置文件中“转换”,并提示用户在安装期间验证或更改它。 –

+0

我无法为所有操作系统作证,但似乎可以用'.returncode'之类的东西来拾取错误代码127,或者通过捕获OSError来测试它,似乎就是这种情况。不过,我同意你的看法,即你的选择是非常理想的。 – Whoopska

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?