Когда я пишу скрипт Python для запуска Devenv с настройкой «Debug|Win32», он ничего не делает.
-
20-08-2019 - |
Вопрос
Обновлять: Когда я использую subprocess.call
вместо subprocess.Popen
, проблема решена, кто-нибудь знает в чем причина?И возникла еще одна проблема:Кажется, я не могу найти способ контролировать выход...Есть ли способ перенаправить вывод из subprocess.call
в строку или что-то в этом роде?Спасибо!
Я пытаюсь использовать Devenv
для создания проектов, и он работает нормально, когда я печатаю его в командной строке, например devenv A.sln /build "Debug|Win32"
- но когда я использую Python для его запуска, используя Popen(cmd,shell=true)
где cmd
это та же строка, что и выше, она ничего не показывает.Если я удалю |
, измените его на "Debug"
только это работает....
Кто-нибудь знает, почему это происходит?Я попробовал поставить \
до |
, но все равно ничего не произошло..
Это код, который я использую:
from subprocess import Popen, PIPE
cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" '
sys.stdout.flush()
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE)
lines = []
for line in p.stdout.readlines():
lines.append(line)
out = string.join(lines)
print out
if out.strip():
print out.strip('\n')
sys.stdout.flush()
...но это не сработает, если я поменяю местами Debug|Win32
с Debug
, работает отлично..
Спасибо за каждый комментарий здесь
Решение
Когда shell = False
используется, он будет обрабатывать строку как одну команду, поэтому вам необходимо передать команду/аргументы в виде списка.Что-то вроде:
from subprocess import Popen, PIPE
cmd = [
r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes
"solution.sln",
"/build",
"Debug|Win32"
]
p = Popen(cmd, stdout=PIPE, stderr=PIPE)
out = p.stdout.read() # reads full output into string, including line breaks
print out
Другие советы
Есть разница между devenv.exe
и devenv.com
, оба из которых являются исполняемыми и находятся в одном каталоге (вздох).В командных строках, используемых в вопросе, и в некоторых ответах не указано, чего они хотят, поэтому я не уверен, что будет использоваться.
Если вы хотите позвонить из командной строки, вам необходимо убедиться, что вы используете devenv.com
, в противном случае у вас, скорее всего, появится графический интерфейс.Я думаю, что это может быть причиной некоторой (но не всей) путаницы.
См. раздел 17.1.5.1.в документации Python.
В Windows Python автоматически добавляет двойные кавычки вокруг аргумента конфигурации проекта, т.е. Debug|win32 передается как «Debug|win32» в devenv.Вам НЕ нужно добавлять двойные кавычки и НЕ нужно передавать Shell=True в Popen.
Используйте ProcMon для просмотра строки аргумента, переданной в devenv.
попробуйте двойные кавычки, например:'devenv A.sln /build "Debug|Win32"'
Похоже, оболочка Windows это принимает |
как труба (несмотря на кавычки и экранирование).Попытался ли ты shell=False
вместо?