Pergunta

Eu estou usando um IDE bruto (Microchip MPLAB) com C30 toolchain no Windows XP. O compilador C tem uma saída muito barulhento que eu sou incapaz de controlar, e é muito difícil de detectar avisos e erros reais na janela de saída.

Eu quero escrever um script Python que iria receber argumentos para o compilador, chamar o compilador com os mesmos argumentos, resultados de filtro e enviá-las para stdout . Então eu posso substituir o executável do compilador com o meu script em ambientes toolchain. O IDE chama o meu script e recebe saída do compilador filtrada.

Meu código para executar os olhares do compilador como esta:

arguments = ' '.join(sys.argv[1:])
cmd = '%s %s' % (compiler_path, arguments)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

O problema é que as cotações de argumentos são consumidos na execução do script, por isso, se IDE chama o meu script com argumentos seguintes:

main.c -o "main.o"

o valor de argumentos é

main.c -omain.o

A solução mais óbvia é colocar lista de argumentos inteira entre aspas, mas isso exigiria modificação no compilador chamar código no IDE. Eu também tentei usando arquivo de lote, mas só pode aceitar nove parâmetros (% 1 a% 9), e compilador é chamado com mais de 15 parâmetros.

Existe uma maneira de transmitir exatamente os mesmos argumentos a um processo de script?

Foi útil?

Solução

Seu escudo é comer as aspas (o script python nunca recebe-los), então eu suponho que não é muito fácil obtê-los 'inalterado'.

Outras dicas

Dê o comando argumentos para Popen como uma lista:

arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Como ChristopheD disse o shell remove as aspas.

Mas você não precisa criar a string-se quando se utiliza Popen: ele pode lidar com isso para você automaticamente. Você pode fazer isso em vez disso:

import sys, subprocess
process = subprocess.Popen(sys.argv[1:], executable=compiler_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

O módulo subprocesso espero venha a passar os argumentos corretamente para você.

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