我在「/ 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
感謝
我在「/ 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
感謝
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
你要使用的,而不是os.system
的subprocess
模塊,對於任何嚴重。對於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。 (在上面的例子中沒有顯示。)
謝謝。我也會研究這一點。 – 2010-07-13 21:57:41
就是這樣。熱狗。 – 2010-07-13 21:43:19