2016-09-15 1 views
1

В качестве примера возьмите команду оболочки «cat file.txt».В подпроцессе Python в чем разница между использованием Popen() и check_output()?

С 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) 

Эти оказывается эквивалентным. В чем разница в отношении того, как эти две команды будут использоваться?

ответ

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)

1

От the documentation:

check_call() и check_output() поднимет CalledProcessError если вызываемый процесс возвращает код возврата ненулевой.