zipfile zippt Ordnerstruktur / Verschieben nach erstellung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

Schönen guten Morgen alle zusammen ;-)
Ich bin gerade bei meinem aktuellen python projekt auf zwei kleine probleme gestoßen, für die ich keinerlei Lösung finden konnte.

Das erste besteht darin, dass beim anlegen einer Zip mittels zipfile nicht nur die Datei gezippt wird, sondern der gesamte Ordnerpfad zu eben dieser Datei (Folder1/Subfolder/File), da ich dem script per variable den dateinamen + pfad übergebe. Wenn ich nur den Dateinamen übergebe funktioniert das ganze nur, wenn das script im selben Verzeichnis liegt, was in meinem Fall nicht sinnvoll ist ;-).

Das zweite Problem ist, dass ich diese Zip nach dem erstellen verschieben will - was zu dem Problem führt, dass Windows die Datei bereits verschieben will während sie noch erstellt (gezippt) wird. Das verursacht - natürlich - eine exception.
Welche sinnvolle gegenmaßnahme gibt es dafür, kann python das OS "zwingen" zuerst den vorherigen Befehl beendet zu haben, bevor es mit der nächsten codezeile anfängt?

Bin für jeden Kommentar dankbar :-)
BlackJack

@sylenz: Man kann ZipFile.write() ein zweites Argument mit dem Pfad/Namen übergeben, unter dem die Datei im Archiv gespeichert werden soll. Nur den letzten Teil des Pfades bekommst Du mit einer der nützlichen Funktionen aus `os.path`.

Beim zweiten Problem habe ich das Gefühl, dass Du ein ganz klein wenig zu wenig Informationen lieferst. Es lässt erahnen, dass Du gar nicht `zipfile` verwendest, und Du verrätst nicht, wie Du es machst, dass nicht gewartet wird. `subprocess.call()` wartet zum Beispiel. Bei Verwendung von `subprocess.Popen` müsste man die `wait()`-Methode aufrufen. Mehr verrät mir meine Glaskugel nicht.
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

Erstmal Danke für deine prompte Antwort :-)
Problem Nr. 1 ist damit behoben, funktioniert so wunderbar.

Problem 2 schildere ich nochmal kurz etwas ausführlicher - ist ja auch kein allzu großes Problem:
Ich packe Dateien innerhalb eines Ordners, schließe sie mit close() und verschiebe sie direkt im Anschluß mittels shutil.move in ein anderes Verzeichnis. Warum Windows die Datei nicht zuerst fertig schreibt - keine Ahnung, die Fehlermeldung ist jedoch dahingehend ziemlich aussagekräftig: "Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird."
wait() / subprocess.call() wartet wohl auf das abschließen des vorherigen Prozesses?
Werde ich gleich nochmal testen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sylenz hat geschrieben:wait() / subprocess.call() wartet wohl auf das abschließen des vorherigen Prozesses?
Werde ich gleich nochmal testen.
Das wird dir nix helfen, weil es ja der gleiche Prozess ist und der automatisch auf sich selbst wartet, weil die Ausführung ja sequenziell ist.

BlackJack meinte nur, dass das hilft wenn du *externe* Prozesse aufrufst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@sylenz: Das zweite Problem dürfte wohl eher bei Windows bzw. laufenden *anderen* Programmen liegen. Wenn Du die Datei geschlossen hast, kann es nämlich nicht mehr *Dein* Programm sein, dass für die Fehlermeldung verantwortlich ist. Ich tippe mal auf einen Indexer oder Virenscanner, der sich die neue ZIP-Datei gerade vornimmt.
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

Das kann natürlich auch sein, wie sähe denn da ein intelligenter workaround aus? Ein paar Milisekunden warten, versuchen die Datei zu öffnen -> wenn ja verschieben -> wenn nein warte x? Klingt in meinen Ohren nicht gerade effizient, aber was besseres fällt mir gerade nicht ein ;-)
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

Ok, das kann so natürlich auch nicht funktionieren, da wenn ich die Datei "probeweise" öffnen will ja die selbe exception ausgeworfen wird.
Ich lasse die Zipfile nun direkt im Ordner erstellen in dem sie am Ende landen sollte - ist zwar nicht meine bevorzugte Lösung, aber funktioniert wenigstens einwandfrei (sleep hatte keinerlei Effekt auf die Exception)

Danke euch beiden vielmals für die professionellen Antworten!
Antworten