2011-07-28 255 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?