1

我想做以下事情:

  • 从 Python 中输出到另一个可执行文件,使用subprocess.check_call
  • 捕获子进程的stderr,如果有的话
  • 将 stderr 输出添加到父进程的 CalledProcessError 异常输出中。

理论上这很简单。check_call函数签名包含一个kwarg stderr

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

但是,紧随其后的文档包含以下警告:

注意:不要使用stdout=PIPEstderr=PIPE与此功能。由于当前进程中没有读取管道,因此如果子进程向管道生成足够的输出以填满 OS 管道缓冲区,则子进程可能会阻塞。

问题是,我能找到的几乎每个从子进程中获取 stderr 的示例都提到了使用subprocess.PIPE来捕获该输出。

如何在不使用的情况下从子进程中捕获 stderr subprocess.PIPE

4

1 回答 1

3

stdout并且stderr可以分配给几乎任何可以接收数据的东西,比如文件句柄。你甚至可以提供一个打开的 file_handle 来写入stdoutstderr

file_handle = open('some_file', 'w')

subprocess.check_call(args, *, stdin=None, stdout=file_handle, stderr=file_handle, shell=False)

现在每一行输出都进入同一个文件,或者你可以为每个文件创建一个不同的文件。

stdin也读起来像一个文件句柄,使用next()来读取每一行作为输入命令,除了初始的args.

它是一个非常强大的功能。

于 2012-12-30T08:51:28.923 回答