Фактически в Windows он использует cmd.exe
, когда shell=True
- он добавляет cmd.exe /c
(он фактически ищет переменную среды COMSPEC
, но по умолчанию имеет значение cmd.exe
, если нет) аргументам оболочки. (В Windows 95/98 он использует промежуточную программу w9xpopen
для фактической запуска команды).
Таким образом, странная реализация на самом деле является UNIX
, которая делает следующее (где каждое пространство разделяет другой аргумент):
/bin/sh -c gcc --version
Похоже, правильная реализация (по крайней мере, в Linux) была бы:
/bin/sh -c "gcc --version" gcc --version
Поскольку это установило бы командную строку из котируемых параметров , и успешно передайте другие параметры.
Из раздела sh
man-страницы для -c
:
blockquote>
Read commands from the command_string operand instead of from the standard input. Special parameter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.) set from the remaining argument operands.
Этот патч довольно просто выполняет трюк:
--- subprocess.py.orig 2009-04-19 04:43:42.000000000 +0200 +++ subprocess.py 2009-08-10 13:08:48.000000000 +0200 @@ -990,7 +990,7 @@ args = list(args) if shell: - args = ["/bin/sh", "-c"] + args + args = ["/bin/sh", "-c"] + [" ".join(args)] + args if executable is None: executable = args[0]