ТЛ;dr:
Ваша проблема - использование shell=True
.Установите для него значение shell=False
, и оно будет работать.
Если эта опция установлена, python будет просто запускать первый элемент массива command
, то есть bash
как сценарий оболочки.Поэтому в настоящее время python запускает собственную оболочку для запуска вашей команды (bash
).Он запустит bash без аргументов, а затем bash будет ожидать ввода, блокируя ваш скрипт на python.
Параметр shell=True
предназначен для случаев использования, когда вы передаете скрипт оболочки в виде одной строки.Когда вы явно указываете оболочку и ее параметры в качестве вызываемого процесса, как вы делаете выше, вы должны установить shell=False
.
>>> import subprocess
>>> subprocess.Popen(['bash', 'whatever'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
Вот как выглядит дерево процессов, когда я запускаювыше:
\_ python
\_ /bin/sh -c bash whatever
\_ bash
Фактически передается whatever
, но это параметр для sh
, а не параметр для внутреннего bash
, поэтому выполняемая команда эффективна ['/bin/sh', '-c', 'bash', 'whatever']
, что весьма отличается от ['/bin/sh', '-c', 'bash whatever']