我有这段代码
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可能吗?
感谢。
答案 0 :(得分:2)
当具有fileno()
方法的对象作为参数传递给stdout=
或stderr=
subprocess.Popen()
时,相关文件描述符将被重定向{{1}或类似的系统调用。
这意味着数据从子进程直接发送到与FD关联的文件 - 它根本不被Python解释器读取,因此Python解释器从不调用{关联对象上的{1}}。
要解决此问题,您确实需要使用fdup2()
- 然后在 write()
和subprocess.PIPE
上持续进行数据调整(你不能通过分析和最终的目的地一个接一个地做到这一点,而不会造成死锁。