2013-05-30 2 views
2

Если я выполнить следующий код питона на Windows:Python: на Linux, subprocess.Popen() работает странно с оболочкой = True

import subprocess 
subprocess.Popen([ 'python', 'foo' ], shell = True).communicate() 

Я получил ошибка записывается в стандартный вывод, как и ожидалось:

python: can't open file 'foo': [Errno 2] No such file or directory 

Но если я выполняю тот же код на linux (ubuntu, OSX - любой), я получил вместо этого текст интерактивный python REPL! Пример:

[email protected]:~/Documents$ python test.py 
Python 2.7.3 (default, Jab 2 2013, 16:53:07) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information 
>>> 

Почему такое странное поведение? выполнение интерпретатора python с аргументом ('foo') должно быть переведено в оценочный режим на всех платформах, а не в режим REPL.

ответ

7

Это прописано в документации:

Аргумент оболочки (который по умолчанию False) определяет, следует ли использовать оболочку в качестве программы для выполнения. Если оболочка True, рекомендуется передавать args как строку, а не как последовательность.

В Unix с оболочкой = True оболочка по умолчанию установлена ​​в/bin/sh. Если args является строкой, строка указывает команду для выполнения через оболочку. Это означает, что строка должна быть отформатирована точно так же, как и при вводе в командной строке. Это включает в себя, например, цитирование или обратную косую черту с экранированием имен файлов с пробелами в них. Если args - это последовательность, первый элемент указывает командную строку и любые дополнительные элементы будут рассматриваться как дополнительные аргументы самой оболочки.

(курсив мой)

+0

+1 для благоразумно подчеркивая – inspectorG4dget

Смежные вопросы