哪个命令在Python中等效

时间:2011-09-26 13:06:48

标签: python command which

我有以下代码用于检查系统上是否存在程序类转储。该程序只返回一个空白。

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

此代码始终返回空白。从技术上讲它应该工作正常吗?

5 个答案:

答案 0 :(得分:3)

我在我的机器上尝试了以下功能,并且完美运行。

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

这是输出

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您使用communicate,它是否有效?请参阅此警告:

  

警告

     

使用communic()而不是.stdin.write,.stdout.read或   .stderr.read以避免由于任何其他OS管道导致的死锁   缓冲填充和阻止子进程。

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

答案 4 :(得分:0)

此代码以编程方式执行与shell 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