开发者

How do I retrieve program output in Python?

开发者 https://www.devze.com 2022-12-30 06:33 出处:网络
I\'m not a Perl user, but from this question deduced that it\'s exceedingly easy to retrieve the standard output of a program executed through a Perl script using something akin to:

I'm not a Perl user, but from this question deduced that it's exceedingly easy to retrieve the standard output of a program executed through a Perl script using something akin to:

$version = `java -version`;  

How would I go about getting the same end result in Python? Does the above line retrieve standard error (equivalent to C++ std::cerr) and standard log (std::clog)开发者_如何学运维 output as well? If not, how can I retrieve those output streams as well?

Thanks, Geoff


For python 2.5: sadly, no. You need to use subprocess:

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

Docs are at http://docs.python.org/library/subprocess.html


In Python 2.7+

from subprocess import check_output as qx

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

The answer to Capturing system command output as a string question has implementation for Python < 2.7.


As others have mentioned you want to use the Python subprocess module for this.

If you really want something that's more succinct you can create a function like:

#!/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)

... then you can call that as:

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

... or whatever.

Note: I'm using shlex.split() as a vastly safer alternative to shell=True

Naturally you could write this to suit your own tastes. Of course for every call you have to either provide three names into which it can unpack the result tuple or you'd have to pull the desired output from the result using normal indexing (captcmd(...)[1] for the output, for example). Naturally you could write a variation of this function to combine stdout and stderr and to discard the result code. Those "features" would make it more like the Perl backtick expressions. (Do that and take out the shlex.split() call and you have something that's as crude and unsafe as what Perl does, in fact).

0

精彩评论

暂无评论...
验证码 换一张
取 消