Frage

Ich bin mit einem rohen IDE (Microchip MPLAB) mit C30 Toolchain unter Windows XP. Der C-Compiler hat eine sehr laute Ausgabe, dass ich die Kontrolle nicht in der Lage bin, und es ist sehr schwer tatsächliche Warnungen und Fehler im Ausgabefenster zu erkennen.

Ich möchte ein Python-Skript schreiben, die sie Argumente für Compiler, rufen Sie den Compiler mit denselben Argumenten, filtern Sie Ergebnisse und Ausgabe auf stdout erhalten würde. Dann kann ich den Compiler ausführbare Datei mit meinem Skript in Toolchain Einstellungen ersetzen. Das IDE ruft mein Skript und empfängt gefiltert Compiler ausgegeben.

Mein Code für die Ausführung der Compiler sieht wie folgt aus:

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

Das Problem ist, dass Zitate von Argumenten auf der Skriptausführung verbraucht werden, so dass, wenn IDE ruft meinen Skript mit folgenden Argumenten:

  

main.c -o "main.o"

Der Wert von Argumente ist

  

main.c -omain.o

Die naheliegendste Lösung ist ganz Argumentliste in Anführungszeichen gesetzt werden, aber dies würde eine Modifikation in Compiler erfordert Code in IDE aufrufen. Ich habe auch versucht Batch-Datei, aber es kann nur neun Parameter (% 1% 9) annehmen, und Compiler mit 15+ Parametern aufgerufen.

Gibt es eine Möglichkeit, genau die gleichen Argumente von Skript zu einem Prozess weiterleiten?

War es hilfreich?

Lösung

Ihre Schale isst die Anführungszeichen (der Python-Skript nicht einmal erhält sie), so nehme ich es nicht ganz einfach ist, sie zu bekommen ‚unverändert‘.

Andere Tipps

Geben Sie den Befehl Argumente Popen als Liste:

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

Wie ChristopheD sagte der Shell die Anführungszeichen entfernt.

Aber Sie brauchen nicht die Zeichenfolge selbst zu erstellen, wenn Popen mit: es automatisch, dass für Sie behandeln können. Sie können dies tun, anstatt:

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

Der Subprozess Modul wird hoffentlich die Argumente richtig für Sie weitergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top