It seems that using shell=True in the first process of a chain somehow drops the stdout from downstream tasks:
p1 = Popen(['echo','hello'], stdout=PIPE)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs correctly ('hello\n', None)
Making the first process use shell=True kills the output somehow...
p1 = Popen(['echo','hello'], stdout=PIPE, shell=True)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs incorrectly ('\n', None)
shell=True on the second process doesn't seem to matter. Is this expected behavior?
When you pass
shell=True
, Popen expects a single string argument, not a list. So when you do this:What happens is this:
That is, it calls
sh -c "echo"
, andhello
is effectively ignored (technically it becomes a positional argument to the shell). So the shell runsecho
, which prints\n
, which is why you see that in your output.If you use
shell=True
, you need to do this: