我想做以下事情:
subprocess.check_call
理论上这很简单。 check_call
函数签名包含stderr
的kwarg:
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
但是,紧接其下方documentation包含以下警告:
注意:请勿对此功能使用
stdout=PIPE
或stderr=PIPE
。由于在当前进程中没有读取管道,子进程可能会阻塞它是否为管道生成足够的输出以填充OS管道缓冲区。
问题在于,我可以找到从子进程获取stderr的每个示例都提到使用subprocess.PIPE
来捕获该输出。
如何在不使用subprocess.PIPE
的情况下从子进程中捕获stderr?
答案 0 :(得分:3)
stdout
和stderr
几乎可以分配给任何可以接收文件句柄等数据的内容。你甚至可以提供一个开放的file_handle来写stdout
和stderr
:
file_handle = open('some_file', 'w')
subprocess.check_call(args, *, stdin=None, stdout=file_handle, stderr=file_handle, shell=False)
现在每行输出都转到同一个文件,或者每个输出都有不同的文件。
stdin
也像文件句柄一样读取,使用next()
读取每一行作为要发送的输入命令以及初始args
。
它非常强大的功能。