【发布时间】:2023-04-04 06:16:01
【问题描述】:
目标是在带有 Popen 的 bash shell 中启动命令,然后将该命令的输出传递给变量,但 Popen 应该等到命令完成后再继续,这不会发生。
我尝试使用 call 代替 Popen,但 call 只输出退出代码,这并不理想。 我也尝试使用 wait(),但出现错误。
var1 = Popen(["command | grep 'stuff' | cut -d 'delimiter' -f3"],
shell=True, stdout=PIPE,
universal_newlines=True).communicate()[0].rstrip()
var2 = Popen(["command | grep 'stuff' | cut -d 'delimiter' -f1"],
shell=True, stdout=PIPE,
universal_newlines=True).communicate()[0].rstrip()
print(var1 + var2)
Python 正确打印 var1,但不是 var2,它是 None,因为它没有被任何东西分配,因为命令没有运行或没有时间完成。 直接在终端上运行 var2 命令,和在 python 程序中完全一样,会产生想要的结果,但是当 python 尝试运行它时,它只是跳过它并打印 var1 和 var2,但只显示 var1 字符串,var2 完全忽略。
【问题讨论】:
-
呃。
communicate()总是 等待管道结束,在本例中为cut,以关闭其标准输出;否则,它不可能返回一个值。这个问题是基于一个错误的前提。 -
当您可以在 Python 本身中执行此操作时,为什么要为
grep和cut使用 shell 管道?这将避免需要shell=True,这几乎是一个等待发生的安全漏洞。 -
...如果您认为
Popen()在管道仍在运行时返回,您将需要提供一个minimal reproducible example 让我们自己观察这种行为。 -
@DanielPryden,点头。
shell=True可以安全使用,如果 OP 将所有动态生成的参数从 shell 解析为代码的参数中移出(['''somecommand "$1" | grep "$2" | cut''', "_", "this-becomes-$1", "this-becomes-$2"],但没有证据表明他们正在这样做。 -
Charles Duffy 有两个 Popen 和两个由这些 Popen 的输出分配的变量。两个Popen都被Python运行后,只打印第一个变量,另一个是None
标签: python subprocess popen