2011-09-26 210 views
1

我有下面的代码,我正在使用它来检查程序类转储是否存在于系统上。该程序只返回一个空白。Python中的等价命令

cmd = ["which","class-dump"] 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
print process.stdout.read() 

此代码始终返回空格。从技术上讲,它应该正确吗?

+1

不'其中类dump'产生在命令行上一个非空输出? –

+0

否,它返回类转储的路径。我想通过代码本身获得路径。 – Amritha

回答

0

嗯,它看起来像类转储不存在(在你的Python解释器使用的PATH)

+0

我不明白。子进程调用实际上应该如何在终端中调用该命令?它在终端中工作正常,但从python运行时保持空白。 – Amritha

+1

@Amritha:'which'所寻找的路径是“当前”PATH的内容,在你的情况下,你的shell中的PATH可能是正确的,但不是你的python解释器中使用的PATH变量。正如Tempos所说,转储你的os.environ [“PATH”]来确认 –

+0

好吧,我现在明白了错误。 shell指向一个不同的路径,并且类转储不在那里。如何更改环境路径?有没有办法做到这一点 ? – Amritha

0

请问,如果你使用communicate,而不是它的工作?看到这个警告:

警告

使用通信(),而不是.stdin.write,.stdout.read或 .stderr.read避免死锁由于任何其他操作系统管 缓冲区填充启动并阻止子进程。

此外,您的脚本可能会在另一个PATH下运行吗?转储os.environ["PATH"]并检查。

+1

只有在使用两个方向的情况下,此警告才有效。我会怀疑PATH的东西... – glglgl

+0

好吧,我现在明白了错误。 shell指向一个不同的路径,并且类转储不在那里。如何更改环境路径?有没有办法做到这一点 ? – Amritha

1

which是内置的外壳。您需要将shell=True传递给Popen。

+0

即使添加了shell = True,仍然会打印空白 – Amritha

+1

@rplnt:'which'是真实文件(/ usr/bin/which)的别名,如果python无法找到哪个可执行文件,它会引发例外。 –

+0

@Cédric感谢您的纠正。不确定,目前没有任何* nix机器在我面前。所以我只是搜索内置的列表,并在那里。 – rplnt

3

我在我的机器上尝试了以下操作,并且完美地工作。

import subprocess 
cmd = ["which","java"] 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
print process.communicate() 

这是输出

('/usr/bin/java\n', None) 
0

此代码做同样的事情作为外壳which命令编程,但它并没有“找到”的符号链接。为了支持这一点,你可以增强isx函数。

import os.path, itertools 
isx = lambda program: lambda folder: (lambda p: \ 
    os.access(p, os.X_OK) and os.path.isfile(p))(os.path.join(folder, program)) 

def which(program): 
    try: 
    return itertools.ifilter(isx(program), os.environ['PATH'].split(':')).next() 
    except StopIteration: 
    raise ValueError, 'no executable file named %s found in search path' % (program,) 

实施例使用:

>>> which('ls') 
'/bin' 
>>> which('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in which 
ValueError: no executable file named foo found in search path