Результаты Python subprocess.Popen () отличаются от командной строки? - PullRequest
1 голос
/ 10 февраля 2012

При использовании Cygwin в Windows 7 x32 в каталоге решений VS команда find дает правильные результаты:

$ find . -iname "*.sln"
./ProjName.sln

, но та же команда с subprocess.Popen() в Python, похоже, совпадает на * один:

>>> import subprocess
>>> print subprocess.Popen(['find', '.', '-iname', '"*.sln"'],
...     stdout=subprocess.PIPE, shell=True).communicate()[0]
.
./.git
./.git/COMMIT_EDITMSG
./.git/config
./.git/description
<snip>

Что не так с моим Popen() звонком?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

У меня работает следующее:

>>> import subprocess
>>> print subprocess.Popen(['find', '.', '-iname', '*.sln'],
...     stdout=subprocess.PIPE, shell=False).communicate()[0]

Обратите внимание на удаление двойных кавычек вокруг *.sln и настройку от shell до False.

Это гарантирует, что *.sln передается find дословно и не раскрывается оболочкой.

edit: Также работает следующее:

>>> print subprocess.Popen(['find . -iname "*.sln"'],
...     stdout=subprocess.PIPE, shell=True).communicate()[0]
2 голосов
/ 12 февраля 2012

В системах POSIX, когда вы используете Popen(['find', '.', '-iname', '"*.sln"'], shell=True), Python делает это:

/bin/sh -c find . -iname "*.sln"

Если вы прочитаете документацию для sh, вы обнаружите, что только первый аргумент после -cобрабатывается как командная строка для выполнения в качестве сценария оболочки.Остальные аргументы фактически обрабатываются как аргументы для сценария оболочки .В этом случае, поскольку сценарий оболочки состоит исключительно из имени команды «find», аргументы игнорируются.Вы можете наблюдать это поведение, если вы запустите:

>>> subprocess.call(['echo arg0 = $0, arg1 = $1', 'foo', 'bar'], shell=True)
arg0 = foo, arg1 = bar
0
0 голосов
/ 10 февраля 2012

Код должен быть:

print subprocess.Popen(['find . -iname "*.sln"'], stdout=subprocess.PIPE, shell=True).communicate()[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...