在不使用subprocess.PIPE的情况下在subprocess.check_call中捕获stderr

时间:2012-12-30 08:01:00

标签: python subprocess stderr

我想做以下事情:

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

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

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

但是,紧接其下方documentation包含以下警告:

  

注意:请勿对此功能使用stdout=PIPEstderr=PIPE。由于在当前进程中没有读取管道,子进程可能会阻塞它是否为管道生成足够的输出以填充OS管道缓冲区。

问题在于,我可以找到从子进程获取stderr的每个示例都提到使用subprocess.PIPE来捕获该输出。

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

1 个答案:

答案 0 :(得分:3)

stdoutstderr几乎可以分配给任何可以接收文件句柄等数据的内容。你甚至可以提供一个开放的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

它非常强大的功能。