2016-11-29 2 views
1

Ich bin derzeit auf Popen, um die Komprimierung & Speicherung von Dokumenten zu automatisieren.Verwenden von subprocess.Popen (shell = True) mit Windows-Ordnern

Für das Kompressionsteil, dachte ich an der folgenden Python-Linie:

subprocess.Popen("WinRAR.exe a -r c:\\03. Notes\\AllTexts *.txt", shell=True) 

Ich halte Fehlermeldungen mit, als der Befehl nicht in der Lage ist, mit einem Ordnernamen zu beschäftigen, die ein Leerzeichen enthält (03. Notes). Diese Frage wurde schon mehrmals gestellt, und ich muss sagen, dass ich alle Sätze ausprobiert habe: rohe Zeichenkette, doppelte Anführungszeichen, dreifache Anführungszeichen, ... Keine von ihnen hat funktioniert.

Da ich die Ordnernamen nicht ändern kann, und ich habe keine Ideen mehr zu versuchen, könnte jemand beraten, wie könnte ich diese Befehlszeile erfolgreich übergeben?

+0

Warum verwenden Sie 'sh ell = Wahr 'überhaupt? Könnten Sie 'list'-basierten Aufruf verwenden (mit dem' glob' Modul, um Ihren Glob zu erweitern), und Python die notwendigen Konvertierungen/Escapes automatisch ausführen lassen, ohne 'shell = True' zu ​​verwenden? – ShadowRanger

+0

Es gibt keinen Grund, die Shell für diesen Befehl zu verwenden. Verwenden Sie eine Argumentliste ohne die Shell, z. 'subprocess.check_call ([" WinRAR.exe "," a "," -r "," C: \ 03. Notes \ AllTexts "," * .txt "])'. – eryksun

+0

Danke für diesen Hinweis. Der check_call ist sehr sinnvoll, da die Liste der Argumente viel länger ist als in meinem Beispiel. Ich weiß nicht, wie ich deinen Kommentar markieren soll, aber es hat mir sehr geholfen. Es stellte die Hoffnung in meinem Automatisierungsprojekt wieder her :-) – JCF

Antwort

1

In Windows sollten Sie Anführungszeichen für Datei- oder Verzeichnisnamen verwenden (wenn Sie Leerzeichen verwenden möchten). In Python, sollten Sie Anführungszeichen mit \ Symbol entkommen (wenn Sie Strings innerhalb "Anführungszeichen verwenden) wie folgt aus:.

"my name is \"Mark\"!" 

Oder einfach:

'my name is "Mark"!' 

So werden diese wie erwartet:

subprocess.Popen("WinRAR.exe a -r \"c:\\03. Notes\\AllTexts\" *.txt", shell=True) 

Neben:

subprocess.Popen('WinRAR.exe a -r "c:\\03. Notes\\AllTexts" *.txt', shell=True) 
+0

Die Verwendung von rohen Strings in Strings ist etwas neues für mich. Ich habe den Code optimiert, und es hat gut funktioniert. Danke für den Tipp. Ich habe auch die check_call-Methode ausprobiert, die oben von eryksun erwähnt wurde. Ich vergleiche jetzt die 2 Methoden. Der check_call sieht ein bisschen einfacher zu lesen und weniger "tückisch" in Bezug auf das Zählen von Backslashes. Wie auch immer, ich wechselte in 6 Stunden von "keine Idee zu testen" zu "2 Optionen zum Vergleichen". Danke vielmals. – JCF

Verwandte Themen