python-2.7 - 在Python多处理中,当子进程完全存在时,标准输出会发生什么?

标签 python-2.7 subprocess python-multiprocessing

我有一个 python 2.7 脚本,我使用 Popen 使用 stdout=PIPE 和 stderr=STDOUT 打开一个子进程。

启动子进程后,我的主脚本会执行一些其他工作,稍后,它会对子进程执行 p.communicate() 。在启动子进程和调用它之间的通信之间的时间里,我的子进程已经完成了它的工作并干净地退出,但通信仍然可以从它的标准输出中读取。当我的子进程完成运行时发生了什么以及它的 stdout 和 stderr 将打开多长时间?

最佳答案

在这种情况下,stdoutstderr 上的字节只是缓冲在内存中,等待您从缓冲区中读取。当您调用 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/

相关文章:

python-2.7 - 在 Python 中向 AWS Elasticsearch 发出签名的 HTTP 请求

python - 如何使用数据透视表 Python 创建重复行

python - sklearn 管道 - 在管道中应用多项式特征变换后应用样本权重

python - 如何防止子进程在某些参数之间添加空格?

python - 访问给定键的列表值的第 n 个元素 : Python dictionary

python - 子进程:意外的关键字参数 capture_output

python - 脚本中的子进程不起作用,手动启动时它起作用

python - slurm 超出了 python 多处理的作业内存限制

python - 调试时在 pool.close() 上抛出异常,但在运行时不会抛出异常

python - *为什么* multiprocessing 序列化我的函数和闭包?