subprocess.Popen () и Shell = True приводят к ошибке «Синтаксис команды неверен» - PullRequest
2 голосов
/ 05 августа 2010

Кажется, я обнаружил проблему с subprocess.Popen() на компьютере с Windows XP x64. Если Popen() вызывается с Shell=True, вместо создания подпроцесса, ошибка

The syntax of the command is incorrect

выводится в командную строку.

Проблема была обнаружена при попытке использовать Mercurial в командной строке. 'hg resolv' завершится с ошибкой выше. Я сузил это до проблемы с Popen (), и сделал сценарий <10 строк, который воспроизводит проблему. Проблема также существует в tortoisehg в различных местах, также из-за того, что она использует <code>Popen() с Shell=True.

Интересно, что если я запускаю свой тест-код с Shell = False, он работает нормально (происходит ожидаемое поведение). Я протестировал код на сборке Windows x86, и с обоими Shell=True & False он работает как положено. Эта конкретная машина имеет некоторые настройки для PATH, но ничего серьезного.

Кто-нибудь знает, что может отличаться в этом компьютере x64, чтобы вызвать эту ошибку. Машина была уже установлена ​​/ настроена до того, как я приступил к работе, поэтому я не уверен, что было изменено. Единственная идея, которая у меня возникла, заключается в том, что из-за неправильного экранирования параметров (или чего-то связанного) возникает некоторая ошибка, однако я не уверен, где это может произойти.

Просто в информационных целях я отправил один из звонков Mercurial на Popen, на случай, если кто-нибудь заметит что-то, что может быть проблемой

p = subprocess.Popen(cmd, shell=True, bufsize=-1,
                     close_fds=closefds,
                     stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                     universal_newlines=newlines,
                     env=env)

К сожалению, я не могу опубликовать тест-код прямо сейчас (он работает), однако я опубликую обновление, как только смогу получить его.


Обновление, код для теста ниже ...

import os
import sys
import subprocess

if 'THG_HGTK_SPAWN' in os.environ:
    print 'spawn successful'
    sys.exit(0)

os.environ['THG_HGTK_SPAWN'] = '1'

subprocess.Popen(args={'python', r'test.py'}, shell=True)

print 'spawning...'

sys.exit(0)
...