如何在Python中检索程序输出?

时间:2010-05-10 16:00:51

标签: c++ python perl

我不是Perl用户,但是从this question推断出使用类似于以下内容的方式检索通过Perl脚本执行的程序的标准输出非常容易:

$version = `java -version`;  

我如何在Python中获得相同的最终结果?以上行是否也检索标准错误(相当于C ++ std :: cerr)和标准log(std :: clog)输出?如果没有,我如何检索那些输出流?

谢谢, 杰夫

3 个答案:

答案 0 :(得分:7)

对于python 2.5:遗憾的是,没有。您需要使用子流程:

import subprocess
proc = subprocess.Popen(['java', '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()

文档位于http://docs.python.org/library/subprocess.html

答案 1 :(得分:6)

在Python 2.7 +

from subprocess import check_output as qx

output = qx(['java', '-version'])

Capturing system command output as a string问题的答案已经实现了Python< 2.7。

答案 2 :(得分:4)

正如其他人所说,你想要使用Python subprocess模块。

如果你真的想要一些更简洁的东西,你可以创建一个像:

这样的功能
#!/usr/bin/env python 
import subprocess, shlex

def captcmd(cmd):
    proc = subprocess.Popen(shlex.split(cmd), \
      stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)

    out, err = proc.communicate()
    ret = proc.returncode
    return (ret, out, err)

...然后你可以称之为:

ok, o, e = captcmd('ls -al /foo /bar ...')
print o
if not ok:
    print >> sys.stderr, "There was an error (%d):\n" % ok
    print >> sys.stderr, e

......或其他什么。

注意:我使用shlex.split()作为shell=True

的更安全的替代方案

当然,你可以写这个来满足自己的口味。当然,对于每个调用,您必须提供三个名称,它们可以解压缩结果元组,或者您必须使用正常索引(例如,captcmd(...)[1]从结果中提取所需的输出)。当然,您可以编写此函数的变体来组合stdout和stderr并丢弃结果代码。这些“功能”会使它更像Perl的反引号表达式。 (这样做并取出shlex.split()电话,你有一些像Perl所做的那样粗暴和不安全的东西,事实上。)