Python: получить вывод из командной строки, которая завершается с ненулевым кодом выхода - PullRequest
6 голосов
/ 16 февраля 2011

Я использую Python 2.7.1 на Windows Server 2008 R2 x64 box.

Я пытаюсь получить выходные данные процесса командной строки, который дает ненулевой статус выхода после вывода необходимой мне информации.

Первоначально я использовал subprocess.check_output и перехватывал CalledProcessError, которая происходит с ненулевым состоянием выхода, но хотя код возврата был сохранен в ошибке, никакой вывод не выявил этого.

Выполнение этого для случаев, которые дают выходные данные, но имеют состояние выхода 0, работает правильно, и я могу получить выходные данные, используя subprocess.check_output.

Я предполагал, что выходные данные записывались в STDOUTно исключение извлекает свой «вывод» из STDERR.Я попытался реализовать функциональность check_output, но я все равно ничего не получаю на выходе, когда считаю, что должен видеть вывод на STDOUT и STDERR.Мой текущий код приведен ниже (где «команда» - это полный текст, включая параметры, команды, которую я выполняю:

process = subprocess.Popen(command, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT, universal_newlines=True)
output = process.communicate()
retcode = process.poll()
if retcode:
    raise subprocess.CalledProcessError(retcode, image_check, output=output)
    return output 

Это дает мне следующее в выводе переменной: [('', None)]

Мой subprocess.Popen код правильный?

Ответы [ 3 ]

10 голосов
/ 16 февраля 2011

Ваш код работает нормально.Оказывается, что процесс, который вы вызываете, вероятно, выводится в CON.См. Следующий пример

import subprocess

def check_output(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
    output = process.communicate()
    retcode = process.poll()
    if retcode:
            raise subprocess.CalledProcessError(retcode, command, output=output[0])
    return output 

command = "echo this>CON"

print "subprocess -> " + subprocess.check_output(command, shell=True)
print "native -> " + str(check_output(command))

try:
    subprocess.check_output("python output.py", shell=True)
except subprocess.CalledProcessError, e:
    print "subproces CalledProcessError.output = " + e.output

try:
    check_output("python output.py")
except subprocess.CalledProcessError, e:
    print "native CalledProcessError.output = " + e.output

Вывод

subprocess -> 
native -> ('', None)
stderr subproces CalledProcessError.output = stdout
native CalledProcessError.output = stderr stdout

К сожалению, я не знаю, как решить проблему.Обратите внимание, что subprocess.check_output results содержит только вывод из stdout.Ваша замена check_output выдаст как stderr, так и stdout.

После проверки subprocess.check_output он действительно генерирует CalledProcessError с выводом, содержащим только stdout.

2 голосов
/ 04 мая 2017

Вы пробовали stderr=subprocess.STDOUT, как указано на странице документации по питону:

Чтобы также зафиксировать стандартную ошибку в результате, используйте STDERR = subprocess.STDOUT:

Вот тестовый код:

import subprocess

try:
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True)
except subprocess.CalledProcessError as e:
    print 'e.output: ', e.output


try:
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print 'e.output: ', e.output

выход:

errrrr
e.output:  
e.output:  errrrr
1 голос
/ 16 февраля 2011

Здесь есть проблема, которая может вас ударить- http://bugs.python.org/issue9905

...