我有以下代码用于检查系统上是否存在程序类转储。该程序只返回一个空白。
cmd = ["which","class-dump"]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
print process.stdout.read()
此代码始终返回空白。从技术上讲它应该工作正常吗?
答案 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