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.
robuster Weg Dateien und Verzeichnisse zu kopieren
https://docs.python.org/3/library/shuti ... l.copytree sollte das durchaus erledigen.
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
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
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.
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.
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
@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:
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:
@ 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.
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.
@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.
Wie man einen Ordner "robust" kopiert, habe ich dir ja in meinem vorherigen Beitrag erklärt. Das sind eine Handvoll Zeilen Code.
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.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.
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/
Vielleicht ist dirsync was für dich?
https://pypi.org/project/dirsync/
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
- DeaD_EyE
- User
- Beiträge: 1240
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Verwende doch einfach Python 3.8, dann kannst du auch das machen: shutil.copytree('baz', 'foo', 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.
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)
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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
@ 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.
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.