Quando eu escrevo um script python para executar Devenv com configure “Debug | Win32” ele não faz nada

StackOverflow https://stackoverflow.com/questions/1049784

  •  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

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top