Из источника subprocess.py:
В UNIX с shell = True: если args является строкой, она указывает
Командная строка для выполнения через оболочку. Если args является последовательностью,
первый элемент указывает командную строку и любые дополнительные элементы
будет рассматриваться как дополнительные аргументы оболочки.
В Windows: класс Popen использует CreateProcess () для выполнения дочернего элемента
Программа, которая работает на строки. Если args - последовательность, это будет
преобразован в строку с помощью метода list2cmdline. Обратите внимание, что
не все приложения MS Windows интерпретируют командную строку одинаково
способ: list2cmdline предназначен для приложений, использующих тот же
правила как среда выполнения MS C.
Это не отвечает почему, просто разъясняет, что вы видите ожидаемое поведение.
«Почему», вероятно, заключается в том, что в UNIX-подобных системах аргументы команд фактически передаются приложениям (используя семейство вызовов exec*
) в виде массива строк. Другими словами, вызывающий процесс решает, что входит в КАЖДЫЙ аргумент командной строки. Принимая во внимание, что когда вы указываете ему использовать оболочку, вызывающий процесс фактически получает только шанс передать один аргумент командной строки в оболочку для выполнения: вся требуемая командная строка, имя исполняемого файла и аргументы в виде одной строки.
Но в Windows вся командная строка (согласно приведенной выше документации) передается в виде одной строки дочернему процессу. Если вы посмотрите на документацию API CreateProcess , вы заметите, что он ожидает, что все аргументы командной строки будут объединены в большую строку (отсюда и вызов list2cmdline
).
Кроме того, есть факт, что в UNIX-подобных системах на самом деле является оболочкой, которая может делать полезные вещи, поэтому я подозреваю, что другая причина заключается в том, что в Windows shell=True
делает ничего, поэтому он работает так, как вы видите. Единственный способ заставить эти две системы работать одинаково - просто отбросить все аргументы командной строки, когда shell=True
в Windows.