Quando eu escrevo um script python para executar Devenv com configure “Debug | Win32” ele não faz nada
-
20-08-2019 - |
Pergunta
Update: Quando eu uso o subprocess.call
vez de subprocess.Popen
, o problema está resolvido - alguém sabe qual é a causa? E veio outro problema: eu não consigo encontrar uma maneira de controlar a saída ... Existe uma maneira de redirecionar a saída do subprocess.call
a uma corda ou algo parecido? Obrigado!
Eu estou tentando usar Devenv
a projetos de construção, e funciona muito bem quando eu digite-o no prompt de comando como devenv A.sln /build "Debug|Win32"
- mas quando eu usar um python para executá-lo usando Popen(cmd,shell=true)
onde cmd
é a mesma linha como acima, não mostra nada. Se eu remover o |
, alterá-lo apenas para "Debug"
, ele funciona ....
Alguém sabe por que isso acontece? Eu tentei colocar um \
antes |
, mas ainda nada aconteceu ..
Este é o código que estou usando:
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()
... que não funciona, no entanto, se eu trocar Debug|Win32
com Debug
, ele funciona perfeitamente ..
Obrigado por cada comentário aqui
Solução
Quando shell = False
é usado, ele vai tratar a cadeia como um único comando, então você precisa para passar o comando / arugments como uma lista .. Algo como:
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
Outras dicas
Há uma diferença entre devenv.exe
e devenv.com
, sendo que ambos são executáveis ??e viver no mesmo diretório (suspiro). As linhas de comando usado na questão e algumas respostas não digo que eles querem, então eu não tenho certeza de que vai se acostumar.
Se você quiser chamar a partir da linha de comando, então você precisa garantir que você use devenv.com
, caso contrário, é provável que você obter um GUI aparecendo. Acho que isso pode ser a causa de alguns (mas não todos) da confusão.
Veja a seção 17.1.5.1. na documentação do python.
No Windows, Python adiciona automaticamente as aspas ao redor do argumento configuração do projeto ou seja Debug | win32 é passado como "Debug | win32" para devenv. Você NÃO precisa adicionar as aspas duplas e você NÃO precisa passar shell = True para Popen.
Use ProcMon para ver a seqüência de argumento passada para devenv.
tentar dupla citando como: 'devenv A.sln / build "Debug | Win32"'
Looks como shell do Windows' está tomando que |
como um pipe (apesar das citações e escapes). Você já tentou shell=False
vez?