Warum hat shell=True Essen, meine Teilprozess.Popen stdout?
Scheint es, dass mit shell=True in der ersten Prozess-Kette irgendwie fällt das stdout von nachgelagerten Aufgaben:
p1 = Popen(['echo','hello'], stdout=PIPE)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs correctly ('hello\n', None)
Machen der erste Prozess verwenden, shell=True tötet die Ausgabe irgendwie...
p1 = Popen(['echo','hello'], stdout=PIPE, shell=True)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs incorrectly ('\n', None)
shell=True auf den zweiten Prozess scheint keine Rolle zu spielen. Ist dieses Verhalten zu erwarten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie übergeben
shell=True
, Popen erwartet ein string argument, nicht eine Liste. Also, wenn Sie dies tun:Was passiert ist:
Ist, ruft es
sh -c "echo"
, undhello
ist effektiv ignoriert (technisch wird eine positionelle argument an die shell). Damit die shell läuftecho
, das Drucke\n
, das ist, warum Sie sehen, dass in Ihrem output.Wenn Sie
shell=True
, die Sie brauchen, um dies zu tun:Popen(['/bin/sh', '-c', args[0], args[1], ...])