2012-12-06 54 views
2
import shlex,subprocess,os 
cmd = "/Applications/LibreOffice.app/Contents/MacOS/swriter --headless --invisible --convert-to pdf:writer_pdf_Export --outdir ~/Downloads ~/Downloads/HS303.xlsx" 
#This works 
os.popen(cmd) 
#This doesnot work 
subprocess.call(shlex.split(cmd)) 

子流程調用不起作用。這是在Mac OSX中完成的。 任何想法爲什麼發生這種情況?子流程調用失敗

+3

請說明「無法正常工作」。是否有任何子進程調用?你會得到什麼結果,一個例外? – dutt

+0

我做了check_output,但它打印'',回答如下 –

回答

5

問題

問題是〜/下載路徑。當您調用subprocess.call時,該擴展的shell環境未啓用。下面是這個問題的簡單演示:

>>> import shlex, subprocess, os, os.path 
>>> cmd = "ls ~/Downloads" 
>>> print os.popen(cmd).read() 
ubuntu-11.04-desktop-i386.iso 
ubuntu-11.04-server-i386.iso 

>>> print subprocess.check_output(shlex.split(cmd)) 
ls: cannot access ~/Downloads: No such file or directory 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/subprocess.py", line 537, in check_output 
    raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command '['ls', '~/Downloads']' returned non-zero exit status 2 

的解決方案

有兩種解決方案,您可以使用,或者使用os.path.expanduser拓展〜在Python或致電subprocess.call/subprocess.check_output與參數shell=True。我傾向於使用check_output而不是call,因爲它返回可能由命令產生的任何輸出。以下任一解決方案都可以解決您的問題。

import shlex, subprocess, os, os.path 
cmd = 'ls ' + os.path.expanduser('~/Downloads') 
print subprocess.check_output(shlex.split(cmd)) 

cmd = 'ls ~/Downloads' 
print subprocess.check_output(cmd, shell=True)