为什么壳=真吃我subprocess.Popen标准输出?(Why does shell=True

2019-06-24 14:25发布

看来,使用壳=在一个链的第一个过程真不知何故滴从下游任务的标准输出:

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

使第一过程中使用壳=真杀死输出莫名其妙...

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

外壳=在第二过程中真正似乎并不重要。 这是预期的行为?

Answer 1:

当你通过shell=True ,POPEN期待一个字符串参数,而不是一个列表。 所以,当你这样做:

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

什么情况是这样的:

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

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

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

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


文章来源: Why does shell=True eat my subprocess.Popen stdout?