2017-10-13 108 views
0

我對Python完全陌生,但我正在努力學習。子流程缺少輸出文件

我想使用subprocess命令來運行一個模擬程序,我可以在終端中在bash環境中調用該程序。語法非常簡單: 命令inputfile.in 其中命令是tcltk環境中的一個更大的仿真腳本。

好吧我已經讀了很多python文獻,並決定使用subprocess命令的Popen功能。

所以,從我的理解,我應該能夠格式化命令如下:

p= subprocess.Popen(['command','inputfile.in'],stdout= subprocess.PIPE]) 
    print(p.communicate()) 

此命令的輸出是兩個文件。當我在終端中運行命令時,我在與原始輸入文件相同的目錄中得到兩個文件。

File1.fid File2.spe. 

當我使用Popen時,有兩件事讓我困惑。 (1)我沒有得到任何輸出文件寫入輸入文件的目錄。 (2)值p.communicate存在,表示模擬已運行。

輸出文件會發生什麼情況。有沒有一種特定的方式來調用一個命令函數來產生文件?

我在for循環裏面的Jupyter筆記本單元中運行它。這個for循環用於迭代地改變輸入文件,從而系統地改變模擬條件。我的操作系統是mac osx。

目標是在for循環的每次迭代中模擬或運行命令,然後將輸出文件數據存儲在較大的字典中。之後,我想在優化過程中將輸出文件數據與實驗數據進行迭代比較,以最大限度地減少殘差。

我將不勝感激任何幫助。如果popen不是正確的python函數,也是任何方向。

+0

用'P = subprocess.Popen([ 'inputfile.in' 命令',],標準錯誤= subprocess.PIPE,標準輸出=子再試一次。 PIPE,stdout = subprocess.PIPE)'。 – swatchai

+0

,從子進程,文件「」,第2行 p = subprocess.Popen(['/ usr/local/bin/simpson',fileName],stdout = subprocess。 PIPE,stdout = subprocess.PIPE) SyntaxError:重複的關鍵字參數 – witheve

+0

對不起,我的錯誤。我有'stdout = subprocess.PIPE'兩次。 – swatchai

回答

0

讓我們從一些容易這樣學習:

# This is equivalent with the command line `dir *.* /s /b` on Windows 
import subprocess 
sp = subprocess.Popen(['dir', '*.*', '/s', '/b'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
(std_out, std_err) = sp.communicate() # returns (stdout, stderr) 

# print out if error occur 
print('std_err: ', std_err) # expect ('std_err: ', '') 
# print out saved echoing messages 
print('std_out: ', std_out) # expect ('std_out: ', ... can be a long list ...) 
+0

這有助於調試過程。雖然p溝通顯示模擬運行在那裏。最終的錯誤與輸入文件中最終進程的格式有關。 – witheve