如何在Python中获取程序输出?
我不是Perl的用户,但从这个问题中了解到,通过Perl脚本获取程序的标准输出非常简单,可以用类似下面的方式:
$version = `java -version`;
那么我该如何在Python中实现同样的效果呢?上面那行代码能获取标准错误输出(相当于C++中的std::cerr)和标准日志输出(std::clog)吗?如果不能的话,我该如何获取这些输出流呢?
谢谢,
Geoff
3 个回答
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]
来获取输出)。当然,你也可以写一个变体函数,把标准输出和错误输出合并,并忽略结果代码。这样的话,它就更像Perl中的反引号表达式了。(如果这样做并去掉shlex.split()
的调用,你得到的东西就和Perl的做法一样粗糙和不安全了)。
6
在 Python 2.7 及以上版本中
from subprocess import check_output as qx
output = qx(['java', '-version'])
关于如何将系统命令的输出捕获为字符串的问题,答案中提供了适用于 Python 2.7 之前版本的实现方法。
7
对于 Python 2.5:很遗憾,不可以。你需要使用 subprocess 模块:
import subprocess
proc = subprocess.Popen(['java', '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
相关文档可以在这里找到:http://docs.python.org/library/subprocess.html