Кажется, я обнаружил проблему с 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)