Python - Code

Probleme bei der Installation?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@Srunz_1975: Woher kommt das Script denn und was glaubst du, was es tut?
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Srunz_1975: Und da dann diese Antwort: https://askubuntu.com/questions/1123058 ... re#1124608

Wie kommst Du da dann darauf das Dein "Download"-Verzeichnis das erste Argument sein sollte‽ Da steht doch deutlich das man nach entpacken der `difftar.gz`-Dateien zwei Verzeichnisse hat ("snapshot/" und "multivol_snapshot/") und das Python-Program ein Verzeichnis im "multivol_snapshot/"-Verzeichnis als erstes Argument erwartet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Und dann sollte als zweites Argument, der Speicherort angegeben werden, richtig?
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Dann so:

python3 db.py multivol_snapshot/ /home/werner/
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also stehen tut da ja (fette Hervorhebung von mir):
So I wrote the below python script, which takes 2 arguments:
  • a directory inside multivol_snapshot/ containing the bits you want to restore
  • a directory to put the restored files inside.
Also nicht "multivol_snapshot/" direkt sondern ein Verzeichnis *in* diesem Verzeichnis. Und dafür das Du nicht wirklich weisst was dieses Skript macht, finde ich es ziemlich mutig gleich das Heimatverzeichnis als Zielverzeichnis anzugeben, es sei denn das ist ein extra für diesen Versuch angelegtes Heimatverzeichnis.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Und wie würdest du das machen?

Ein Verzeichnis als Unterordner von "werner" anlegen (z.B.: /home/werner/Restore/)!

Mein Englisch ist nicht besonders gut, wie du sicherlich schon gemerkt hast!
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ja genau, ich würde zum Testen einen extra Zielordner erstellen.

Für Englisch gibt's im Internet ja auch Werkzeuge zum übersetzen. Das ist zwar nicht perfekt, aber in der Regel brauchbar. Das Zitat oben maschinell übersetzt:
Also habe ich das folgende Python-Skript geschrieben, das 2 Argumente benötigt:
  • ein Verzeichnis innerhalb von multivol_snapshot/, das die Bits enthält, die Sie wiederherstellen möchten.
  • ein Verzeichnis, um die wiederhergestellten Dateien hineinzulegen.
Einzig „die Bits“ hätte man vielleicht besser mit „die Teile“ oder „die Dateien“ übersetzt. Aber auch so finde ich das schon verständlich. Ein Kollege von mir hat sich dafür ein Browserplugin installiert mit dem er markierten Text an verschiedene Übersetzungsdienste übergeben kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Danke schon mal im voraus!
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

__blackjack__ hat geschrieben: Freitag 13. Dezember 2019, 18:09 @Srunz_1975: Ergänzend zu sparrow's Anmerkung zu `Path`: Warum ist das auskommentiert und warum wird ``os.path`` importiert aber nirgends im Programm verwendet‽

Die übergabe von `sys.argv` minus dem ersten Element kann man sich sparen weil man der `ArgumentParser.parse()` auch einfach gar nichts übergeben kann.

`sys.exit()` ist sinnfrei weil `FileReconstructor.reconstruct_files()` überhaupt keinen Rückgabewert hat.

Mindestens `copy_file_parts_to()` ist keine Methode sondern einfach nur eine Funktion die in die Klasse gesteckt wurde. Ich würde aber die ganze Klasse in Frage stellen.

Mal ohne die unnütze Klasse (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import argparse
import shutil
from pathlib import Path


def walk_unpacked_leaf_dirs(unpacked_path):
    """
    Based on the assumption that all leaf files are named as numbers.
    """
    seen_dirs = set()
    for path in unpacked_path.rglob("*"):
        if path.is_file():
            if path.parent not in seen_dirs:
                seen_dirs.add(path.parent)
                yield path.parent


def copy_file_parts_to(target_file, leaf_dir_path):
    file_parts = sorted(leaf_dir_path.iterdir(), key=lambda x: int(x.name))
    for file_part in file_parts:
        with file_part.open("rb") as source_file:
            shutil.copyfileobj(source_file, target_file)


def reconstruct_files(unpacked_path, restore_path):
    for leaf_dir_path in walk_unpacked_leaf_dirs(unpacked_path):
        target_path = restore_path / leaf_dir_path.relative_to(unpacked_path)
        target_path.parent.mkdir(parents=True, exist_ok=True)
        with target_path.open("wb") as target_file:
            copy_file_parts_to(target_file, leaf_dir_path)


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "unpacked_dir", help="The directory with the unpacked tar files"
    )
    parser.add_argument(
        "restore_dir", help="The directory to restore files into"
    )
    return parser.parse_args()


def main():
    args = parse_args()
    reconstruct_files(
        Path(args.unpacked_dir).resolve(), Path(args.restore_dir).resolve()
    )


if __name__ == "__main__":
    main()
Wenn ich es so schreibe, kommt folgende Fehlermeldung:

python3 DD.py /home/werner/Backup/Entpackt/multivol_snapshot/home/werner/Videos/TV-Serien/THE_BOURNE_LEGACY.iso/ /home/werner/Restore

Kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "DD.py", line 53, in <module>
    main()
  File "DD.py", line 48, in main
    Path(args.unpacked_dir).resolve(), Path(args.restore_dir).resolve()
  File "DD.py", line 30, in reconstruct_files
    with target_path.open("wb") as target_file:
  File "/usr/lib/python3.7/pathlib.py", line 1186, in open
    opener=self._opener)
  File "/usr/lib/python3.7/pathlib.py", line 1039, in _opener
    return self._accessor.open(self, flags, mode)
IsADirectoryError: [Errno 21] Is a directory: '/home/werner/Restore'
Antworten