2013-06-28 85 views
3

我有一些python代碼,我想從中調用另一個程序。這一計劃將Python - 無法調用系統命令

  • 打印一些輸出STDOUT
  • 將文件寫入到磁盤

使用call我碰到下面的行爲;

from subprocess import call 
call(['./tango_x86_64_release', 'VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"']) 
34, File not properly written, try writing it up again, 
1 

這種情況不管,如果參數被分成列表與否;

call(['./tango_x86_64_release', 'VTS1', 'ct="N"', 'nt="N"', 'ph="7.2"', 'te="303"', 'io="0.02"', 'seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"']) 
34, File not properly written, try writing it up again, 
1 

我可以從我的終端

./tango_x86_64_release VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV" 

其中一期工程,並給出了0

好像其寫入磁盤,這是造成問題的退出狀態調用此相同的命令,如果我中斷了命令,那麼我會得到相應的警告消息(即刪除一個參數,它會警告我缺少該參數)。

使用subprocess.Popen()給出OSError;

import subprocess as sub 
output = sub.Popen('./tango_x86_64_release VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"', stdout=sub.PIPE, stderr=sub.PIPE) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/usr/lib64/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

任何幫助,不勝感激

+2

嘗試'殼= TRUE'添加到'Popen'電話。 – alecxe

+1

似乎很難在您的環境之外重現。試圖創建一個小的,可複製的用例可能會給你答案([橡皮鴨調試](http://en.wikipedia.org/wiki/Rubber_duck_debugging)) –

+0

@alecxe - 你是我的英雄。砰的錢(張貼它作爲一個答案 - 我不能相信這一切花了!!) – Alex

回答

3

使用shlex.split爲您拆分命令:

import shlex 
call(shlex.split('./tango_x86_64_release VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"')) 

注意,雖然您可能能夠通過增加shell=True解決你的問題,你應該避免如果可能的話,因爲它可以是security risk(搜索「殼注入」)。