2012-06-01 84 views
1

我想寫一個python腳本來執行一個命令行程序,並從另一個文件導入參數。本方案的命令行接口的工作原理如下: ./executable.x參數的(a)參數(b)中的參數(c)中...Python:如何使用其他文件的參數執行外部程序?

我的代碼是:

#program to pass parameters to softsusy 
import subprocess 
#open parameter file 
f = open('test.dat', 'r') 
program = './executable.x' 
#select line from file and pass to program 
for line in f: 
    subprocess.Popen([program, line]) 

測試。 dat文件如下所示:

param(a) param(b) param(c)... 

腳本調用程序,但它不傳遞變量。我錯過了什麼?

回答

1

你想:

line=f.readline() 
subprocess.Popen([program]+line.split()) 

你現在有什麼會通過整條生產線的程序作爲一個參數。 (就像調用它的外殼爲program "arg1 arg2 arg3"

當然,如果你想一次調用程序文件中的每一行:

with open('test.dat','r') as f: 
for line in f: 
    #you could use shlex.split(line) as well -- that will preserve quotes, etc. 
    subprocess.Popen([program]+line.split()) 
+0

那完美。謝謝您的幫助。 – user1431534

+0

我會如何將子流程的輸出保存到文件中? – user1431534

+0

創建一個文件對象('outputfile = open('output.txt','w')')並使用'stdout'關鍵字將它傳遞給Popen:'('subprocess.Popen(arglist,stdout = outputfile)') – mgilson

0

首先,你的情況下,使用subprocess.call ()not subprocess.popen()

至於「參數未被傳遞」,腳本中沒有明顯的錯誤,嘗試將整個事件連接成長字符串並將字符串賦給.call()而不是list 。

subprocess.call(program + " " + " ".join(line)) 

您確定line包含您期望它包含的數據嗎?

要確保,(如果源文件是短暫的)嘗試打開文件到列表中明確,並確保有數據在「行」:

for line in file.readlines(): 
    if len(line.trim().split(" ")) < 2: 
     raise Exception("Where are my params?") 
+0

行包含文件的一行。如果該行是「hello」,那麼你的解決方案會將「h l l o o」作爲參數傳遞。而且使用'Popen'沒有什麼問題 - 無論如何,使用'call'只是圍繞'Popen'的一個包裝。 – mgilson

+0

此外,'line.trim()'會引發AttributeError,因爲字符串沒有修剪方法。 (至少不在python 2.6中)。 'line.split()'應該工作得很好。 – mgilson

相關問題