在Python子进程中,使用Popen()和check_output()有什么区别?

时间:2016-09-15 11:32:30

标签: python bash shell subprocess

采取shell命令" cat file.txt"举个例子。

使用Popen,可以使用

运行
import subprocess
task = subprocess.Popen("cat file.txt", shell=True,  stdout=subprocess.PIPE)
data = task.stdout.read()

使用check_output,可以运行

import subprocess
command=r"""cat file.log"""
output=subprocess.check_output(command, shell=True)

这些似乎是等效的。关于如何使用这两个命令有什么区别?

2 个答案:

答案 0 :(得分:1)

来自the documentation

  如果被调用进程返回非零返回码,则

check_call()check_output()将引发CalledProcessError

答案 1 :(得分:1)

Popen是定义用于与外部进程交互的对象的类。 check_output()只是Popen实例的包装器,用于检查其标准输出。这是Python 2.7(无文档字符串)的定义:

def check_output(*popenargs, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise CalledProcessError(retcode, cmd, output=output)
    return output

(定义有点不同,但最终仍然是Popen实例的包装。)