robuster Weg Dateien und Verzeichnisse zu kopieren

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.
M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann nimm halt rsync. Das ist flexibler und leistungsfähiger.
M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

"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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

gugust Du, Eröffnungsbeitrag.
Hab mich gerade selbst zitiert. ""
Der Pfosten stand schon da - hast Ihn wohl übersehen.
Benutzeravatar
__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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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: 🤷‍♂️
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

@ 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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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/
Benutzeravatar
__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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
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)

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
M.Miehtke
User
Beiträge: 10
Registriert: Sonntag 16. August 2020, 20:23

@ 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.
Antworten