我有一个 python 2.7 脚本,我使用 Popen 使用 stdout=PIPE 和 stderr=STDOUT 打开一个子进程。
启动子进程后,我的主脚本会执行一些其他工作,稍后,它会对子进程执行 p.communicate() 。在启动子进程和调用它之间的通信之间的时间里,我的子进程已经完成了它的工作并干净地退出,但通信仍然可以从它的标准输出中读取。当我的子进程完成运行时发生了什么以及它的 stdout 和 stderr 将打开多长时间?
最佳答案
在这种情况下,stdout
和 stderr
上的字节只是缓冲在内存中,等待您从缓冲区中读取。当您调用 p.communicate() 时,它会读取缓冲区并返回两个 Python 对象的元组,其中分别包含来自 stdout 和 stderr 的数据。当您组合 stdout 和 stderr 时,正如您在此处所做的那样,元组中返回的第二个值将始终为 None
,所有数据都交错出现在元组的第一个值中。
如果进程可以产生大量输出,则必须小心不要溢出缓冲区,如 subprocess.communicate
中警告的那样。文档。
Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited.
调用p.communicate()
也是一个阻塞调用,等待进程终止。返回后,stdout/stderr 将关闭,并且整数 p.returncode
属性已设置。
关于python-2.7 - 在Python多处理中,当子进程完全存在时,标准输出会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59109672/