gpt4 book ai didi

python - 为什么 shell=True 会吃掉我的 subprocess.Popen stdout?

转载 作者:太空狗 更新时间:2023-10-29 18:23:31 25 4
gpt4 key购买 nike

似乎在链的第一个进程中使用 shell=True 以某种方式从下游任务中删除标准输出:

p1 = Popen(['echo','hello'], stdout=PIPE)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs correctly ('hello\n', None)

让第一个进程使用 shell=True 以某种方式终止输出...

p1 = Popen(['echo','hello'], stdout=PIPE, shell=True)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs incorrectly ('\n', None)

第二个进程的 shell=True 似乎无关紧要。这是预期的行为吗?

最佳答案

当您传递 shell=True 时,Popen 需要一个字符串参数,而不是一个列表。所以当你这样做时:

p1 = Popen(['echo','hello'], stdout=PIPE, shell=True)

这是怎么回事:

execve("/bin/sh", ["/bin/sh", "-c", "echo", "hello"], ...)

也就是说,它调用 sh -c "echo",而 hello 被有效地忽略(技术上它成为 shell 的位置参数)。因此 shell 运行 echo,打印 \n,这就是为什么您会在输出中看到它。

如果你使用shell=True,你需要这样做:

p1 = Popen('echo hello', stdout=PIPE, shell=True)

关于python - 为什么 shell=True 会吃掉我的 subprocess.Popen stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com