在subprocess.check_call期间处理stdout或stderr重定向到文件

时间:2017-06-20 17:44:01

标签: python subprocess stdout

我有这段代码

fd_log_out = open(path_log_out, 'w')
fd_log_err = open(path_log_err, 'w')
subprocess.check_call(command, cwd=path, stdout=fd_log_out, stderr=fd_log_err)

我想在check_call期间处理stderr以在触发事件时触发事件。我曾尝试创建 TextIOWrapper 的子类并覆盖 write 函数但从未调用过它。

subprocess.check_call调用的函数是什么。源代码太复杂,无法找到它。

还有其他办法吗?有PIPE可能吗?

感谢。

1 个答案:

答案 0 :(得分:2)

当具有fileno()方法的对象作为参数传递给stdout=stderr= subprocess.Popen()时,相关文件描述符将被重定向{{1}或类似的系统调用。

这意味着数据从子进程直接发送到与FD关联的文件 - 它根本不被Python解释器读取,因此Python解释器从不调用{关联对象上的{1}}。

要解决此问题,您确实需要使用fdup2() - 然后在 write()subprocess.PIPE 上持续进行数据调整(你不能通过分析和最终的目的地一个接一个地做到这一点,而不会造成死锁。