2012-07-17 36 views
1

我正在嘗試編寫一個將字符串發送到程序並將其放入後臺的Python腳本。在命令行中,我可以複製和粘貼下面的代碼,並將它成功地做我想做的Python程序做:Python子流程Popen將一個字符串管道傳遞給程序

printf "f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" | vpfit95 

其中:vpfit95是一個別名,以我的路徑中的可執行程序。

什麼,我已經嘗試了一些排列(試過一次一個):

import subprocess 
vpfitExecutable = 'vpfit95' 

String1=r'f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n' 
String2=r"f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" 
String3="f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" 

cmd1 = "printf \"" + String1 + "\"" 
cmd2 = "printf \"" + String1 + "\" | " + vpfitExecutable 
cmd3 = "printf \"" + String2 + "\"" 
cmd4 = "printf \"" + String3 + "\"" 

print cmd2 

p1 = subprocess.Popen([vpfitExecutable, cmd1]) 
p2 = subprocess.Popen([cmd2]) 
p3 = subprocess.Popen([vpfitExecutable, cmd3]) 
p4 = subprocess.Popen([vpfitExecutable, cmd4]) 
p4 = subprocess.Popen([vpfitExecutable, String1]) 
p5 = subprocess.Popen([vpfitExecutable, String2]) 
p6 = subprocess.Popen([vpfitExecutable, String3]) 

# check 
p7 = subprocess.Popen([vpfitExecutable]) # works. 

而且全部失敗(除P7)。某些失敗,出現「Fortran運行時錯誤:文件結束」(來自vpfit程序)。其他操作失敗,回溯到子進程庫和「OSError:[Errno 2]沒有這樣的文件或目錄」。

一些檢查:當我打印cmd2並將其複製並粘貼到終端時,它可以正常工作。當我運行p7時,它正確地開始按預期運行程序,只是沒有輸入字符串。我顯然在這裏失去了一些根本性的東西,我無法弄清楚什麼。任何幫助感謝!

回答

5

是的,你錯過了一些基本的東西 - 管道由shell處理。要做你想要的子進程,你應該運行vpfit95作爲子進程,然後communicate與它一起運行。請參閱文檔的第17.1.4.2節,replacing a shell pipeline

proc = subprocess.Popen([vpfitExecutable], stdin=subprocess.PIPE) 
proc.communicate(input='your string') 

如果您需要檢查vpfit的輸出和錯誤,然後從communicate輸出元組抓住把手。

骯髒的替代方法是使用shell=True運行你的命令,該命令在shell中產生,然後你可以在你的命令中使用管道,但是「切斷中間人」並直接與子進程交互更清潔。

+0

好吧,我實際上已經嘗試過(在你的建議之前和之後)。這裏發生了什麼:vpfit啓動並等待輸入 - 它從來沒有看到傳遞給它的字符串。如果我補充說vpfit是一個古怪的老fortran程序,它有幫助嗎? – JBWhitmore 2012-07-17 07:25:04

+0

這不應該是一個胡思亂想的老fortran程序。你使用'stdin'手柄嗎?這是一個關鍵字arg到Popen,我將它添加到我的答案中。 – wim 2012-07-17 07:26:37

+0

它工作。一開始沒有看到你的編輯。謝謝! – JBWhitmore 2012-07-17 07:30:43

相關問題