2010-07-13 71 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