2015-08-08 124 views
1

我正在嘗試編寫一個Python腳本來從多個目錄中的bash中遞歸運行一個程序,並在日誌文件中保存(現在只是顯示)輸出。從特定目錄中的python腳本運行bash命令

問題是,當我試圖從主目錄運行該應用程序,只是給它的輸入文件的完整路徑崩潰,所以我通常直接在包含輸入文件的目錄中運行它。我試圖用os.popen()和pexpect來做到這一點,但我認爲這裏最合適的就是子進程。

我的代碼:

import subprocess, 
from subprocess import Popen, PIPE 

subprocess.Popen("$fp "+pcr+" "+dat, cwd=path+dirs[0], stdout=PIPE) 
print output.stdout.read() 

其中PCR和DAT輸入文件的名稱。

當我嘗試運行它,我得到以下錯誤:

Traceback (most recent call last): 
File "file_ed.py", line 47, in <module> 
subprocess.Popen("$fp "+pcr+" "+dat, cwd=retval, stdout=PIPE) 
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

可能是什麼這個問題的原因,以及如何解決它?

+1

您正在嘗試訪問文件或運行不存在的命令。例如,可能沒有命令'$ fp'。有關在子進程中使用環境變量的信息,請參見[此問題](http://stackoverflow.com/questions/26643719/python-exporting-environment-variables-in-subprocess-popen)。 –

+0

運行一系列bash命令的最好方法是編寫一個bash腳本來完成它。你的方法是艱難的。 – msw

回答

2

我認爲你的問題是,你想通過pcrdat作爲程序的參數,你認爲空白會爲你做 - 但Python不是bash。只需使用一個數組,它應該工作:

subprocess.Popen([fp, pcr, dat], cwd=path+dirs[0], stdout=PIPE) 

你得到了「沒有這樣的文件或目錄」的原因是:由於Python是尋找一個名爲"$fp "+pcr+" "+dat程序,即它假定空白(美元符號,除非你的意思是它是一種僞代碼佔位符)是程序名稱的一部分。錯誤告訴你沒有這樣的名字的程序。

但很難猜出您的意思,因爲您的代碼段不完整。我真的不知道什麼是$fppcrdat的意思。

另請參閱子流程模塊文檔中的示例。

+0

對不起''fp dat'和'pcr'這個模棱兩可的問題。最後兩個是我說的字符串包含我想要運行的應用程序的輸入文件。 '$ fp'是bash中應用程序的符號鏈接,但我不認爲它會以這種方式工作,所以我將其更改爲完整路徑。我用pexpect解決了它:'child = pexpect.run('/ usr/local/bin/FullProf_Suite/fp2k'+ pcr +''+ dat,logfile = sys.stdout,cwd = path + dirs [0]) – Silneus

+0

'path'和'dirs [0]'只是形成我的工作目錄的路徑的字符串。感謝您的回覆! – Silneus