在 Python 多处理中,当子进程完全存在时,stdout 会发生什么?
In Python multiprocessing, what happens to stdout when subprocess exists cleanly?
我有一个 python 2.7 脚本,我从中打开一个带有 Popen 的子进程,stdout=PIPE 和 stderr=STDOUT。
启动子进程后,我的主脚本会做一些其他工作,稍后,它会对子进程执行 p.communicate()。在启动子进程和调用 communicate 之间经过的时间里,我的子进程已经完成了它的工作并且干净地退出了,但是 communicate 仍然可以从它的标准输出中读取。当我的子进程完成时发生了什么 运行 以及它的 stdout 和 stderr 将打开多长时间?
在这种情况下,stdout
和 stderr
上的字节只是简单地缓冲在内存中,等待您从缓冲区中读取。当您调用 p.communicate()
时,它会读取缓冲区和 returns 两个 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()
也是阻塞调用,等待进程终止。在这个returns之后,stdout/stderr将被关闭并且整数p.returncode
属性已经被设置。
我有一个 python 2.7 脚本,我从中打开一个带有 Popen 的子进程,stdout=PIPE 和 stderr=STDOUT。
启动子进程后,我的主脚本会做一些其他工作,稍后,它会对子进程执行 p.communicate()。在启动子进程和调用 communicate 之间经过的时间里,我的子进程已经完成了它的工作并且干净地退出了,但是 communicate 仍然可以从它的标准输出中读取。当我的子进程完成时发生了什么 运行 以及它的 stdout 和 stderr 将打开多长时间?
在这种情况下,stdout
和 stderr
上的字节只是简单地缓冲在内存中,等待您从缓冲区中读取。当您调用 p.communicate()
时,它会读取缓冲区和 returns 两个 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()
也是阻塞调用,等待进程终止。在这个returns之后,stdout/stderr将被关闭并且整数p.returncode
属性已经被设置。