我不是Perl用户,但是从this question推断出使用类似于以下内容的方式检索通过Perl脚本执行的程序的标准输出非常容易:
$version = `java -version`;
我如何在Python中获得相同的最终结果?以上行是否也检索标准错误(相当于C ++ std :: cerr)和标准log(std :: clog)输出?如果没有,我如何检索那些输出流?
谢谢, 杰夫
答案 0 :(得分:7)
对于python 2.5:遗憾的是,没有。您需要使用子流程:
import subprocess
proc = subprocess.Popen(['java', '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
答案 1 :(得分:6)
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所做的那样粗暴和不安全的东西,事实上。)