Domanda

Io sto usando un IDE greggio (Microchip MPLAB) con C30 toolchain su Windows XP. Il compilatore C è dotato di un'uscita molto rumoroso che io sono in grado di controllare, ed è molto difficile da individuare avvertenze e gli errori nella finestra di output.

Voglio scrivere uno script python che avrebbe ricevuto gli argomenti per il compilatore, chiamare il compilatore con gli stessi argomenti, filtrare i risultati e li uscita per stdout . Poi posso sostituire l'eseguibile del compilatore con il mio script nelle impostazioni della toolchain. L'IDE chiama il mio script e riceve l'output del compilatore filtrato.

Il mio codice per l'esecuzione del compilatore simile a questo:

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

Il problema è che le citazioni da argomenti sono consumati in esecuzione di script, quindi se IDE chiama il mio script con i seguenti argomenti:

  

main.c -o "main.o"

il valore di argomenti è

  

main.c -omain.o

La soluzione più ovvia è quella di mettere tutta la lista degli argomenti tra virgolette, ma ciò richiederebbe modifiche nel compilatore codice chiamante in IDE. Ho anche provato ad utilizzare file batch, ma si può accettare solo nove parametri (% 1 a% 9), ed il compilatore viene chiamato con oltre 15 parametri.

C'è un modo per trasmettere esattamente gli stessi argomenti ad un processo dal copione?

È stato utile?

Soluzione

La shell sta mangiando le virgolette (lo script python non li riceve nemmeno) quindi suppongo che non è molto facile da ottenere loro 'inalterata'.

Altri suggerimenti

Dare gli argomenti del comando a Popen come una lista:

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

Come ChristopheD detto il guscio rimuove le virgolette.

Ma non è necessario per creare la stringa da soli quando si utilizza Popen: si può gestire questo automaticamente per voi. Si può fare questo, invece:

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

Il modulo sottoprocesso spera passerà gli argomenti in modo corretto per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top