从Python添加路径和调用外部程序时出现问题

时间:2010-07-13 21:35:23

标签: python linux

我在“/ home / myname / mydir /”中有一个名为“foo”的可执行文件,我试图用Python调用它,但我在这里做了一些基本和错误的事情。你能救我吗?

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

由于

2 个答案:

答案 0 :(得分:14)

sys.path是Python库的路径,而不是搜索二进制文件的系统路径。请尝试更改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 :(得分:3)

对于任何严重的问题,您都希望使用subprocess模块而不是os.system。对于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]是'foo'而不是'/ home / myname / mydir / foo',那就这样做:

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

subprocessos.system好得多的原因是它提供了对参数列表的更好控制:它不需要shell解析命令行,这样可以避免整个大量潜在的安全问题,特别是用户提供的文件名等。另一个原因是subprocess提供了更好的错误处理,以及更好的stdin,stdout和stderr重定向。 (上面的例子中没有显示。)