Что означает аргумент 'shell' в подпроцессе в Windows? - PullRequest
1 голос
/ 21 апреля 2009

Документы для модуля подпроцесса указывают, что «Если shell - True, указанная команда будет выполнена через оболочку». Что это означает на практике в ОС Windows?

Ответы [ 4 ]

3 голосов
/ 21 апреля 2009

Это означает, что команда будет выполнена с использованием программы, указанной в переменной окружения COMSPEC. Обычно cmd.exe.

Если быть точным, подпроцесс вызывает функцию CreateProcess windows api, передавая "cmd.exe /c " + args в качестве аргумента lpCommandLine.

Если shell == False, аргумент lpCommandLine для CreateProcess просто args.

1 голос
/ 21 апреля 2009

Когда вы выполняете внешний процесс, требуемая команда может выглядеть примерно так: «foo arg1 arg2 arg3». Если «foo» - исполняемый файл, это то, что выполняется и получает аргументы.

Однако часто случается, что «foo» на самом деле представляет собой какой-то сценарий или может быть командой, встроенной в оболочку, а не действительным исполняемым файлом на диске. В этом случае система не может выполнить «foo» напрямую, потому что, строго говоря, такие вещи не являются исполняемыми. Им нужна какая-то «оболочка» для их выполнения. В системах * nix эта оболочка обычно (но не обязательно) / bin / sh. В Windows это обычно будет cmd.exe (или любой другой файл, который хранится в переменной среды COMSPEC).

Этот параметр позволяет вам определить, какую оболочку вы хотите использовать для выполнения вашей команды, для относительно редкого случая, когда вы не хотите использовать значение по умолчанию.

0 голосов
/ 21 апреля 2009

В дополнение к тому, что было сказано в других ответах, на практике полезно, если вы хотите открыть файл в средстве просмотра по умолчанию для этого типа файлов. Например, если вы хотите открыть файл HTML или PDF, но не будете знать, какой браузер или программа просмотра установлены в системах, на которых он будет работать, или не будете иметь никаких гарантий относительно пути к исполняемому файлу, вы можете просто передать имя файла в качестве единственного аргумента для поля args, затем установите shell = True. Это заставит Windows использовать любую программу, связанную с этим типом файла. Одно предостережение: если путь к вашему файлу содержит пробелы, вам нужно окружить его двумя ".

например.

path = "C:\\Documents and Settings\\Bob\\Desktop\\New Folder\\README.txt"
subprocess.call('""' + path + '""', shell = True)
0 голосов
/ 21 апреля 2009

В используя модуль-подпроцесс , есть явный абзац:

Исполняемый аргумент указывает программу для выполнения. Это очень редко требуется: обычно программа для выполнения определяется аргументом args. Если shell = True, исполняемый аргумент указывает, какую оболочку использовать. В Unix оболочкой по умолчанию является / bin / sh. В Windows оболочка по умолчанию указывается переменной среды COMSPEC.

Пример Windows - команда оболочки (cmd.exe) date -t не будет распознана без оболочки:

>>> p=subprocess.Popen(["date", "/t"], stdout=subprocess.PIPE)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python26\lib\subprocess.py", line 595, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
>>> 

С оболочкой все хорошо:

>>> p=subprocess.Popen(["date", "/t"], shell=True, stdout=subprocess.PIPE)
>>> p.communicate()
('Wed 04/22/2009 \r\n', None)
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...