如何在Python中获取程序输出?

3 投票
3 回答
1004 浏览
提问于 2025-04-15 22:33

我不是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

撰写回答