繁体   English   中英

如何正确完成(管道)python 子进程

[英]How to properly finish a (piped) python subprocess

我有这个小示例代码片段,它基本上做了一个ls | grep foo ls | grep foo与 python 子进程:

import subprocess
import warnings

warnings.simplefilter("always")

lhs = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
rhs = subprocess.Popen(["grep", "foo"], stdin=lhs.stdout)
lhs.stdout.close()
rhs.communicate()

最后,我收到一条警告:

“/usr/lib/python3.8/subprocess.py:942: ResourceWarning: 子进程 1519 仍在运行”

由于我的代码等效于https://docs.python.org/3.8/library/subprocess.html#replacing-shell-pipeline ,因此我很确定会做正确的事情。 那么为什么会生成这个警告,或者我可以做些什么来防止 python 在那里抱怨(除了抑制警告)?

你错过了lhs.communicate() lhs.wait()communicate也等待过程完成,但wait更不言自明),

lhs = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
rhs = subprocess.Popen(["grep", "foo"], stdin=lhs.stdout)
lhs.stdout.close()
rhs.communicate()
lhs.wait()

但是 IMO 你应该使用更高级别的函数,比如subprocess.run

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM