2010-07-13 28 views
4

我在「/ home/myname/mydir /」中有一個名爲「foo」的可執行文件,我試圖從Python調用它,但我在這裏做了一些基本和錯誤的事情。你可以幫我嗎?添加路徑和從Python調用外部程序的問題

import os, sys 
sys.path.append("/home/myname/mydir/") 
os.system("foo") # os.system("./foo") doesn't work either 

感謝

回答

11

sys.path是通向Python庫,而不是系統PATH搜索二進制文件。改爲嘗試改變os.environ['PATH']

>>> sys.path.append("/opt/local/bin") 
>>> os.system("wget") 
sh: wget: command not found 
32512 
>>> os.environ['PATH'] += os.pathsep + '/opt/local/bin' 
>>> os.system("wget") 
wget: missing URL 
+1

就是這樣。熱狗。 – 2010-07-13 21:43:19

3

你要使用的,而不是os.systemsubprocess模塊,對於任何嚴重。對於os.system,這樣做:

os.system('/home/myname/mydir/foo ') 

subprocess

p = subprocess.Popen(['/home/myname/mydir/foo']) 
p.communicate('') 
if p.returncode != 0: 
    raise Exception('foo failed') 

如果你關心Foo的的argv [0]是 '富' 而不是 '/家庭/ MYNAME/MYDIR /富',做這樣的:

p = subprocess.Popen(['foo'], executable='/home/myname/mydir/foo') 

原因subprocess這麼多比os.system出色的是,它在參數列表中提供了更好的控制:它不需要命令線T o被shell解析,並且避免了一系列潛在的安全問題,特別是用戶提供的文件名等。另一個原因是subprocess可以更好地處理錯誤,並更好地重定向stdin,stdout和stderr。 (在上面的例子中沒有顯示。)

+0

謝謝。我也會研究這一點。 – 2010-07-13 21:57:41