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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发生异常时,Python Pandoc子进程不打印STDOUT相关的知识,希望对你有一定的参考价值。

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

我以前在哪里:

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.PIPE替换capture_output会导致所有内容的输出,无论是否发生异常,error.output仍为空。

所以我试验了:

This prints everything I would see if I executed the command in the command-line.

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

This prints out nothing.

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''

因此异常被触发,但输出对象为空。

答案

似乎错误消息存在于error.stderr中而不是error.output中。我尝试了你的例子(有一个不存在的文件):

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

希望能帮助到你。

另一答案

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

例:

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

以上是关于发生异常时,Python Pandoc子进程不打印STDOUT的主要内容,如果未能解决你的问题,请参考以下文章

python多进程

Python:当父进程死亡时如何杀死子进程?

Python - 调用 perl 作为子进程 - 等待完成其后台进程并打印到 shell

Python子进程阻塞并获取BadStatusLine异常

node.js python子进程不会实时打印

python 异常处理进程