我在“/ 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