Weiterleitung Befehlszeilenargumente ein Verfahren in Python
-
13-09-2019 - |
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?
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.