Seite 1 von 2
robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 21:01
von M.Miehtke
Hallo,
ich möchte ein Python Script schreiben, das Backups von FireFox Profilen anlegt.
Dabei müssen Dateien und Ordner kopiert werden.
Schön wäre es, wenn es auf den gleichen Systemen wie FireFox laufen würde.
shutil.copy…. Scheint ja ehre eine Blaupause zu sein,
da es merkwürdige Voraussetzungen für eine fehlerfreie Funktion hat und mit Execeptions um sich wirft. Es gibt auch keine Parameter um das Verhalte anzupassen.
Kennt jemand eine robuste Implementierung oder irgend etwas ähnliches Beispielhaftes,
für das kopieren von Dateien und Ordnern in Python?
Kann doch nicht sein, dass das nicht schon vorher jemand gebaut hat.
Am besten OpenSource, dann würde es zu meinem Vorhaben passen.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 21:10
von sparrow
Was genau stört dich denn an shutil.copy?
Wenn es mit Exceptions um sich wirft, solltest du die vielleicht behandeln?
Zeig doch mal, was da deiner Meinung nach nicht geht.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 21:13
von __deets__
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 21:26
von M.Miehtke
copytree ist ein Paradebeispiel
wenn der Ordner schon existiert → exeption
wenn ich die Fange schön aber nutzlos,
weil kein Parameter, um das verhalten von copytree anzupassen
https://stackoverflow.com/questions/186 ... using-pyth
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 21:38
von Sirius3
Deshalb kopiert man ja auch in ein neues Verzeichnis, weil in ein bestehendes hineinzukopieren so viele Sonderfälle abdecken muss. Und was gefällt dir an der stackoverflow-Antwort nicht?
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 21:59
von M.Miehtke
na ja, wie Du schon schreibst,
weil man "so viele Sonderfälle abdecken muss"
Es ist halt von Design nicht sehr schön gemacht,
high level Funktionen die low level Funktion aufrufen, ohne
Paramether durchzureichen.
Also singel use case Funktionen zu bauen.
Das heißt immer ich muss alles reimplementieren.
Und da kam halt die Frage auf, ob das nicht schon jemand vor mir gemacht hat.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 22:03
von __deets__
Na dann nimm halt rsync. Das ist flexibler und leistungsfähiger.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 22:07
von M.Miehtke
"Schön wäre es, wenn es auf den gleichen Systemen wie FireFox laufen würde."
ohne noch zusätlich Programme installieren zu müssen.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 22:24
von __deets__
Wenn ich jetzt noch einen Vorschlag mache, hast du sicher noch eine neue Position für den Torpfosten. Das spare ich mir dann doch lieber.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Sonntag 16. August 2020, 22:34
von M.Miehtke
gugust Du, Eröffnungsbeitrag.
Hab mich gerade selbst zitiert. ""
Der Pfosten stand schon da - hast Ihn wohl übersehen.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 01:01
von __blackjack__
@M.Miehtke: Der Zusatz ist das ausserhalb des Zitats, denn ``rsync`` sollte es auf den Systemen auf denen Firefox läuft auch geben, widerspricht dem Zitat also nicht.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 06:22
von sparrow
@M.Miehtke: Du rrzählst zwar, warum vorgeschlagene Lösungen deiner Meinung nach nicht funktionieren, aber du hast noch nicht mit einem Wort erwähnt, was du eigentlich erreichen möchtest. Und ich befürchte, du verwendest das Wort "robust" in einem falschen Zusammenhang.
Du möchtest ein Verzeichnis kopieren? Nimm copytree.
Vorher prüfst du, ob das Zielverzeichnis existiert. Ist dem so, benennst du es um.
Sollte der Kopiervorgang durchlaufen, löscht du das alte, umbenannte Verzeichnis. Wenn nicht, löscht du das neue Verzeichnis und benennst das alte wieder um und informierst den Benutzer, dass das Kopieren nicht erfolgreich war. _Das_ wäre in meinen Augen robust. Und ich sehe auch nicht, wo da ein Problem mit den eingebauten Funktionen ist.
Wenn du einen Spezialfall abbilden willst - zum Beispiel "überschreibe nur wenn neuer", dann musst du sowieso selbst aktiv werden. Denn so etwas erwartet niemand von einer Kopierfunktion.
Aber da hier niemand weiß, was du tun willst:

Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 11:22
von snafu
copytree() hat den copy_function Parameter. Da kann man den eigentlichen Aufruf von copy() oder copy2() mit dem gewünschten Error-Handling und sonstigem Verhalten als Callback übergeben.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 11:23
von M.Miehtke
@ sparrow
ich sage nicht, dass die vorgeschlagenen Lösungen nicht funktionieren.
Ich frage:
"Kennt jemand eine robuste Implementierung oder irgend etwas ähnliches Beispielhaftes,
für das kopieren von Dateien und Ordnern in Python?
Kann doch nicht sein, dass das nicht schon vorher jemand gebaut hat."
@ alle
als gibt es eine alternatives Modul?
gibt es schon Code als Beispiel, der mit Hilfe von Python Modulen, Ordner und Dateien kopiert und
diverse Fehlerfälle behandelt?
nur mal so als Beispiel:
um copytree verwenden zu können, muss jeder doch erst mal Code schreiben
der alle Bedingungen prüft, alle Exceptions fängt und alternativ abarbeitet
Entweder kopiert niemand Dateien und Ordner mit Python so das dieser Code noch geschrieben werden muss oder hier im Forum hat keiner ne Idee wo ich den finden kann.
Ich würde mich gerne mehr um die andern Aspekte des Scrips kümmern, als
darum wie man auf „robuste“ Art und Weise ein paar Ordner und Dateien kopiert.
Halt die Idee hinter einem Modul.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 11:27
von sparrow
@M.Miehtk: Dann schreib doch nach 6 wortreichen Beiträgen einfach, was das Ziel ist, das du erreichen möchtest. Das tust du nämlich wieder nicht.
Wie man einen Ordner "robust" kopiert, habe ich dir ja in meinem vorherigen Beitrag erklärt. Das sind eine Handvoll Zeilen Code.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 11:57
von nezzcarth
M.Miehtke hat geschrieben: Montag 17. August 2020, 11:23
Entweder kopiert niemand Dateien und Ordner mit Python so das dieser Code noch geschrieben werden muss oder hier im Forum hat keiner ne Idee wo ich den finden kann.
Doch, Leute kopieren erfolgreich Dateien und Ordner mit Python, auch mit den von dir monierten Funktionen. Das kann ich aus erster Hand bezeugen. Der "Trick" ist, das Vorhandene zu nutzen, um das von dir gewünschte Nicht-Standardverhalten beispielsweise etwa durch das Abfangen von Exceptions und andere Möglichkeiten umzusetzen. Wenn man nicht mit den Sachen aus der Standardbibliothek auskommt, kann man auch externe Module wie
fs/PyFilesystem2 einsetzen. Deiner Beschreibung nach dürften dessen Kopierfunktionen deine Spezialanforderungen aber auch nicht erfüllen.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 12:09
von snafu
Scheint ja um etwas mehr als um das bloße Kopieren zu gehen.
Vielleicht ist dirsync was für dich?
https://pypi.org/project/dirsync/
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 12:19
von __blackjack__
@M.Miehtke: Es kann gar keine Lösung geben die all die Sonderfälle behandelt, denn wenn es die gäbe, dann müsste die ja auf magische Weise wissen wie *Du* in *diesem Fall* die Sonderfälle behandelt haben willst.
Die vorhandene Lösung deckt das ab, was man in den vielen Fällen braucht. Wenn die Möglichkeiten an Argumenten/Callbacks für den eigenen Anwendungsfall nicht ausreichen, muss man halt selbst etwas schreiben was genau die Sonderfälle abdeckt, die man braucht.
Wenn das am Ende auf so etwas wie ``rsync`` hinausläuft, dann ist auch auch kein kopieren mehr, sondern Ordner synchronisieren. Was noch mal ein paar Sonderfälle mehr hat als reines kopieren. Denn da ist ja auch entscheiden ob etwas überschrieben werden soll oder nicht, und ggf. auch Löschen mit dabei. Und da würde ich dann eher auf etwas vorhandenes und erprobtes wie ``rsync`` setzen, statt so etwas selbst umzusetzen und viele Tests zu schreiben um sicherzustellen, dass die Sonderfälle auch alle korrekt umgesetzt sind. Gerade bei Sicherungskopien ist mir wohler etwas ausgereiftes zu verwenden.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 14:23
von DeaD_EyE
Verwende doch einfach Python 3.8, dann kannst du auch das machen: shutil.copytree('baz', 'foo', dirs_exist_ok=True)
Code: Alles auswählen
import shutil
import platform
from pathlib import Path
if platform.system() == "Linux":
profiles = Path.home() / ".mozilla/firefox/"
if platform.system() == "Windows":
profiles = Path.home() / "AppData/Local/Mozilla/Firefox/Profiles"
else:
raise ValueError("OS wird nicht unterstützt")
backup_dir = Path.home() / "profiles_backup"
backup_dir.mkdir(exist_ok=True, parents=True)
shutil.copytree(profiles, backup / profile.name, dirs_exist_ok=True)
Zu robust ist auch nicht OK. Wie soll z.B. das Script reagieren, wenn gerade beim Schreiben die Festplatte kaputtgeht oder die Netzwerkressource (z.b. samba freigabe) nicht erreichbar ist?
Wenn man den Code zu "robust" macht, erreicht man oft das Gegenteil. Man fängt an sinnlos irgendwelche Bedingungen vorher zu prüfen, die sich dann später aber wieder verändern können.
Re: robuster Weg Dateien und Verzeichnisse zu kopieren
Verfasst: Montag 17. August 2020, 15:48
von M.Miehtke
@ nezzcarth
Danke, konstruktiver Beitrag.
Hab mir fs/PyFilesystem2 angesehen und klingt sehr interessant für die Abstraktionseben gegenüber dem Filesystem.
@ snafu
Du hast schon recht, nur kopieren will ich am Ende nicht.
Sync erfüllt die Anforderungen aber irgendwie auch nicht.
Aber danke für die Inspiration.