кажется, что с помощью оболочки = True в первом процессе цепочки как-то роняет стандартный вывод из последующих задач:Почему shell = True есть мой subprocess.Popen stdout?
p1 = Popen(['echo','hello'], stdout=PIPE)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs correctly ('hello\n', None)
Создание первого использования процесса оболочки = 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 на втором процессе, похоже, не имеет значения. Это ожидаемое поведение?
Спасибо! Для потомков вот [docs] (http://docs.python.org/library/subprocess.html): В Unix с оболочкой = True: если args - это последовательность, первый элемент указывает строку команды, и любые дополнительные элементы будут рассматриваться как дополнительные аргументы самой оболочки. То есть, Popen делает эквивалент: 'Popen (['/ bin/sh', '-c', args [0], args [1], ...])' –
очень плохо документирован, ИМХО – Davide