Подпроцесс Python Pandoc не печатает STDOUT при возникновении исключения - PullRequest
0 голосов
/ 25 марта 2019

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

Где я был раньше:

try:
    proc = subprocess.run(
        command,
        capture_output=True,
        check=True,
        text=True,
    )
except subprocess.CalledProcessError as error:
    print(error.output)

Это не сработало,

Вывод, когда происходит subprocess.CalledProcessError:

b'' 

Замена capture_output с stdout = subprocess.PIPE выдает все, независимо от того, произошло исключение или нет, error.output все еще был пуст.

Итак, я экспериментировал:

Это выводит на печать все, что я увидел бы, если бы я выполнил команду в командной строке.

subprocess.run(
    command,
    stdout=subprocess.PIPE,
)

Это ничего не выводит.

proc = subprocess.run(
    command,
    capture_output=True,
)
print(proc.stdout.decode())

Я также попробовал subprocess.check_output (), который, по моим данным, делает то же самое, что и subprocess.run () с флагами, которые я установил в первом фрагменте кода.

Чего мне здесь не хватает?Спасибо.

Приложение

import subprocess

command = ['pandoc', 'file']

try:
    proc = subprocess.run(
        command,
        capture_output=True,
        check=True,
    )
except subprocess.CalledProcessError as error:
    print('Exception:')
    print(error.output)

Это MWE с конкретным процессом, который я хочу запустить ( pandoc )

Вывод

$ pandoc file
pandoc: file: openBinaryFile: does not exist (No such file or directory)

$ ./samplecode.py
Exception:
b''

Таким образом, исключение срабатывает, но выходной объект пуст.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Кажется, что сообщение об ошибке присутствует в error.stderr, а не в error.output. Я попробовал ваш пример (с ls несуществующего файла):

import subprocess

command = ['ls', 'file']

try:
    proc = subprocess.run(
        command,
        check=True,
        capture_output=True,
        text=True
    )
except subprocess.CalledProcessError as error:
    print('Exception:')
    print('output : ' + error.output)
    print('stderr : ' + error.stderr)

Вывод следующий:

Exception:
output : 
stderr : ls: file: No such file or directory

Надеюсь, это поможет.

0 голосов
/ 25 марта 2019

Я верю, что ты хочешь бежать - stderr=subprocess.PIPE.Это должно напечатать соответствующий код ошибки в стандартный вывод ошибки консоли.

Пример:

process = subprocess.Popen(['ls', 'myfile.txt'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(output,error) = process.communicate()
if error:
    print error
...