似乎在链的第一个进程中使用shell=True会以某种方式从下游任务中删除stdout:
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需要单个字符串参数,而不是列表。所以当你这么做的时候:发生了什么事:
也就是说,它调用
sh -c "echo"
,而hello
被有效地忽略(技术上它成为shell的位置参数)。所以shell运行echo
,它打印\n
,这就是为什么您在输出中看到这一点。如果使用
shell=True
,则需要执行以下操作:相关问题 更多 >
编程相关推荐