Seite 1 von 1

subprocess.check_call (Pfadangabe mit Leerzeichen)

Verfasst: Mittwoch 12. Juni 2013, 16:56
von baitu
Hallo!


Ich hätte mal eine Verständnisfrage:
Wie kann ich einen Pfad aus einer Variable heraus an subprocess.check_call übergeben, so dass auch Pfadangaben mit Leerzeichen richtig übernomen werden?
Beispiel:

Code: Alles auswählen

subprocess.check_call(['msiexec', '/a', datei, '/qb', 'TARGETDIR=' + (filesplit(datei))[3]], stderr=subprocess.STDOUT)
(filesplit(datei))[3]] -> erzeugt mir anhand des Dateinamens (datei) den Pfad (Dateiname, ohne Dateiendung).

Wenn ich anstelle von (filesplit(datei))[3]] z.B. "C:\\TEMP" eintrage, funktioniert das Skript...

Wie kann ich bei der Variable Anführungszeichen hinzufügen?

Ich benutze Python 3.3

Vielen Dank im Voraus!

Re: subprocess.check_call (Pfadangabe mit Leerzeichen)

Verfasst: Mittwoch 12. Juni 2013, 17:06
von BlackJack
@baitu: Wenn Du tatsächlich Anführungszeichen übergeben willst, dann musst Du die halt mit in die Zeichenkette des betreffenden Arguments schreiben.

Code: Alles auswählen

    subprocess.check_call(
        [
            'msiexec', '/a', datei, '/qb',
            'TARGETDIR="{0}"'.format(filesplit(datei)[3])
        ],
        stderr=subprocess.STDOUT
    )

Re: subprocess.check_call (Pfadangabe mit Leerzeichen)

Verfasst: Donnerstag 13. Juni 2013, 14:24
von baitu
@BlackJack: zunächst einmal vielen Dank für die schnelle Hilfe.
Ich habe mich zuvor ein wenig mit AutoScript befasst, in Python bin ich allerdings kompletter Neuling.

Ich habe leider immer noch das Problem mit der Übergabe der Variable.

Als Hintergrund-Info: ich bastel an einer Möglichkeit, wie ich diverse Treiber oder Software-Produkte bis in die letzte Datei entpacken kann, um anschließend von den so erzeugten Dateien Hashwerte zu erzeugen (MD5, SHA1, SHA256).

Also... per "DOS"-BATCH-Datei sieht der Befehl so aus:

Code: Alles auswählen

msiexec /a "C:\HydraVision Package v13.4\13-4_vista_win7_win8_32-64_hydravision\$_OUTDIR\Packages\Apps\HydraVision\HydraVision.msi" /qb TARGETDIR="C:\HydraVision Package v13.4\13-4_vista_win7_win8_32-64_hydravision\$_OUTDIR\Packages\Apps\HydraVision\HydraVision"
Dieser Befehl funktioniert auch (trotz Leer- und Sonderzeichen).

Wenn ich unter Python 3.3 folgenden Befehl ausführe,

Code: Alles auswählen

subprocess.check_call(['msiexec.exe', '/a', datei, '/qb', 'TARGETDIR="{0}"'.format((filesplit(datei))[3])], stderr=subprocess.STDOUT)
bekomme ich diese Fehlermeldung:

Code: Alles auswählen

subprocess.CalledProcessError: Command '['msiexec.exe', '/a', 'C:\\HydraVision Package v13.4\\13-4_vista_win7_win8_32-64_hydravision\\$_OUTDIR\\Packages\\Apps\\HydraVision\\HydraVision.msi', '/qb', 'TARGETDIR="C:\\HydraVision Package v13.4\\13-4_vista_win7_win8_32-64_hydravision\\$_OUTDIR\\Packages\\Apps\\HydraVision\\HydraVision"']' returned non-zero exit status 1639
Die Übergabe der Leerzeichen scheint ja zu stimmen.


Führe ich folgenden Befehl aus,

Code: Alles auswählen

subprocess.check_call(['msiexec.exe', '/a', datei, '/qb', 'TARGETDIR=' + "D:\TEMP"], stderr=subprocess.STDOUT)
wird dieser sauber ausgeführt.

Füge ich jedoch ein Lehrzeichen hinzu ("D:\TEMP 2"), funktioniert der Befehl schon nicht mehr. Ich erhalte die gleiche Fehlermeldung wie oben...
Notfalls kann ich mir auch eine Batch-Datei erzeugen lassen, diese ausführen und anschließend wieder löschen... Aber das ist ja nicht gerade der "coolste" Weg...


Eines vielleicht noch abschließend...

Code: Alles auswählen

subprocess.check_call(["\\Tools\\7z.exe", "x", datei, "-o" + (filesplit(datei))[3]], stderr=subprocess.STDOUT)
funktioniert auch ohne Anführungszeichen (auch wenn Leerzeichen oder ähnliches enthalten sind).