Die Ausführung eines teilprozesses ausfällt
Ich versuchte zu rufen, einen Prozess über Python mit mehreren Argumenten. Die Ausführung der batch-Datei selbst funktioniert gut für mich, aber das übersetzen in Python macht mich Schreien. Hier der Inhalt der batch-Datei:
"C:\Program Files\bin\cspybat" "C:\Program Files\bin\armproc.dll" "C:\Program Files\bin\armjlink.dll" "C:\Documents and Settings\USER\Desktop\CAL\testing\Verification\FRT\Code\TC1\Output\Genericb\Debug\Exe\Gen.out" --download_only --backend -B "--endian=little" "--cpu=Cortex-M3" "--fpu=None" "-p" "C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf" "--drv_verify_download" "--semihosting" "--device=STM32F10xxB" "-d" "jlink" "--drv_communication=USB0" "--jlink_speed=auto" "--jlink_initial_speed=32" "--jlink_reset_strategy=0,0"
Die ausführbare Datei ausführen, indem Sie die batch-Datei benannt ist cspybat
. Die Ausgabe der ausführbaren Datei enthält die Informationen: All parameters after
--backendare passed to the back end
.
Beachten Sie auch, dass einige der Parameter, Zeichenketten sind und einige nicht.
Lösung
Das funktioniert für mich nun:
""" MCU flashing function"""
params = [r"C:\Program Files\bin\cspy",
r"C:\Program Files\bin\arpro.dll",
r"C:\Program Files\bin\arjink.dll",
r"C:\Documents and Settings\USER\Desktop\Exe\GenerV530b.out",
"--download_only", "--backend", "-B", "--endian=little", "--cpu=Cort3", "--fpu=None", "-p",
r"C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf",
"--drv_verify_download", "--semihosting", "--device=STM32F10xxB", "-d", "jlink", "--drv_communication=USB0",
"--jlink_speed=auto", "--jlink_initial_speed=32", "--jlink_reset_strategy=0,0" ]
print(subprocess.list2cmdline(params))
p = subprocess.Popen(subprocess.list2cmdline(params))
InformationsquelleAutor der Frage binaryguy | 2009-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausführen einer batch-Datei unter Windows:
Wenn Sie nicht möchten, führen Sie die batch-Datei, sondern führen Sie den Befehl in Ihre Frage direkt aus Python, müssen Sie ein wenig Experimentieren mit dem ersten argument zu Popen.
Zunächst das erste argument kann entweder ein string sein oder eine Sequenz.
So dass Sie entweder schreiben:
oder
Gemäß der Dokumentation:
Also, wenn Sie mit einer Sequenz, es wird in eine Zeichenfolge konvertiert werden. Ich würde wohl versuchen, mit einer Sequenz, die erste, seitdem Sie nicht haben, zu zitieren, alle Elemente, die Leerzeichen enthalten, (
list2cmdline()
übernimmt das für Sie).Für die Fehlersuche empfehle ich, Sie übergeben Ihre Sequenz
subprocess.list2cmdline()
und überprüfen Sie die Ausgabe.Edit:
Hier ist, was ich tun würde, wenn ich du wäre:
a) Erstellen Sie ein einfaches Python-Skript (
testparams.py
) wie folgt:b) Führen Sie das Skript von der Kommandozeile aus (
python testparams.py
), kopieren Sie Sie und fügen Sie die Ausgabe an einen anderen Befehl Linie, drücken Sie enter und sehen, was passiert.c) Wenn es nicht funktioniert, Bearbeiten Sie die python-Datei und wiederholen, bis es funktioniert.
InformationsquelleAutor der Antwort codeape
Erste, Sie nicht müssen all diese Zitate. So entfernen Sie diese. Sie müssen nur die Anführungszeichen um die Parameter, die einen Dateinamen, wenn der Dateiname ein Leerzeichen enthält (blöd, Windows tut das oft).
Ihre Parameter sind einfach eine Liste von strings, von denen einige müssen von Anführungszeichen. Da Windows verwendet nicht-standard -
\
für einen Pfad-separator, verwenden Sie "raw" strings für diesen Namen.Etwas wie
InformationsquelleAutor der Antwort S.Lott