2010-03-18 93 views
9

我需要從我的Python腳本執行這個腳本。如何從Python腳本調用可執行文件?

可能嗎?該腳本生成一些輸出,其中正在寫入一些文件。我如何訪問這些文件?我嘗試過使用子進程調用函數,但沒有成功。

[email protected]:~/Documents/projects/foo$ bin/bar -c somefile.xml -d text.txt -r aString -f anotherString >output 

應用程序「bar」也引用某些庫,它還會在輸出之外創建文件「bar.xml」。我如何訪問這些文件?只需使用open()?

謝謝

編輯:

從Python運行時造成的誤差只有這一行。

$ python foo.py 
bin/bar: bin/bar: cannot execute binary file 
+1

子過程是你需要使用的,你能提供一個例子,所以我們有一個更好的想法,爲什麼它不工作? – 2010-03-18 22:08:23

+0

「子流程調用」?那是什麼?請發佈您使用的代碼和您實際得到的錯誤。 – 2010-03-18 22:51:04

+0

是的,他正在談論標準「subprocess」模塊中的「調用」功能,儘管os.system可能足以滿足他的需要 – 2010-03-19 01:37:54

回答

23

爲了執行外部程序,做到這一點:

import subprocess 
args = ("bin/bar", "-c", "somefile.xml", "-d", "text.txt", "-r", "aString", "-f", "anotherString") 
#Or just: 
#args = "bin/bar -c somefile.xml -d text.txt -r aString -f anotherString".split() 
popen = subprocess.Popen(args, stdout=subprocess.PIPE) 
popen.wait() 
output = popen.stdout.read() 
print output 

是的,假設你的bin/bar程序寫了一些其他雜七雜八的文件到硬盤,您可以打開它們按正常的open("path/to/output/file.txt")。請注意,如果不需要,您不需要依賴子shell將輸出重定向到名爲「output」的磁盤上的文件。我在這裏展示瞭如何直接讀取輸出到你的python程序而不需要在兩者之間的磁盤。

+0

嗨,彼得,有錯誤:bin/bar:bin/bar:無法執行二進制文件,也沒有來自Python運行時的任何其他信息。原因是什麼? – 2010-03-19 11:51:00

+0

這是關於可執行文件的錯誤。我已經解決了,謝謝彼得。 – 2010-03-20 17:29:07

11

最簡單的方法是:

import os 
cmd = 'bin/bar --option --otheroption' 
os.system(cmd) # returns the exit status 

您訪問這些文件通常的方式,通過使用open()

如果您需要進行更復雜的子流程管理,那麼subprocess模塊就可以了。

相關問題