发生异常时,Python Pandoc子进程不打印STDOUT

时间:2019-03-25 15:36:36

标签: python exception subprocess pandoc

我正在尝试使用子进程运行一个进程,并仅在发生异常时打印其整个输出。

我以前在哪里:

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

这不起作用。

发生subprocess.CalledProcessError时的输出:

b'' 

用stdout = subprocess替换capture_output。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 个答案:

答案 0 :(得分:1)

似乎错误消息出现在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

希望有帮助。

答案 1 :(得分:0)

我相信您的意思是stderr=subprocess.PIPE。这应该将相关的错误代码打印到标准控制台错误输出中。

示例:

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