tar-Modul & Prozentanzeige

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
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

Hallo,
ich wollte generell fragen ob es eine Möglichkeit gibt bei einer Tar-Sicherung die % anzeigen zu können oder nicht? Wenn ja habt ihr Beispiele oder Doku darüber?
BlackJack

@eyescube: Generell gibt es die Möglichkeit so etwas selber zu implementieren. Dazu müsstest Du die zu sichernde Verzeichnisstruktur selber vorher einmal durchgehen und die Dateien zählen oder die Dateigrössen aufsummieren, damit Du weisst was 100% sind. In einem zweiten Durchgang kannst Du die Dateien dann hinzufügen und immer ausgeben wie viel Prozent davon schon hinzugefügt wurden.

Ich habe so etwas mal in diesem Skript gemacht: https://bitbucket.org/blackjack/rtar.py/src
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

Cool Danke hab mir auch grad was gebastelt nur was heissen diese Fehler

Code: Alles auswählen

  python test.py
sh: C:WINDOWSsystem32ipconfig.exe: Kommando nicht gefunden.
PROGRESS: 100%
ERROR: No autostart entry could be created!
Traceback (most recent call last):
  File "test.py", line 494, in <module>
    Backup(lock, sources, excludes, config_file, date_file, choices, compressed).main_loop()
  File "test.py", line 353, in main_loop
    choice, date, self.target_dir = self.read_config()
  File "test.py", line 120, in read_config
    print >> sys.stderr, '''Error: File "%s" (configuration file) couldn't be read!\nQuitting.''' % self.config_file
AttributeError: Backup instance has no attribute 'config_file'
ja das ich auf Linux grad arbeite is ok aber warum erscheint der Rest hast jmd vll ne Idee und könnte mir das näher erklären? danke
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Das sieht so aus, als versuchtest du eine Datei einzulesen die nicht existiert. Den Fehler fängst du dann ab und machst in der Fehlerbehandlung noch einmal einen Fehler.
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

ich verstehs nur nicht weil die Datei existiert :/ aber danke /me :)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

eyescube hat geschrieben:ich verstehs nur nicht weil die Datei existiert
Wir kennen deinen Code nicht. Vielleicht hast du einen anderen Fehler der fälschlicherweise zur Ausgabe dieser Fehlermeldung führt. Das wilde Abfangen von Exceptions ohne genaue Angabe der Ausnahme ist in diesem Kontext ein typisches Problem.

Irgendetwas ist da verkorkst. Alleine schon die Tatsache, dass du im Backup-Object ein nicht vorhandenes Attribut namens config_file erwartest, deutet auf ein Problem hin.
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

das is der Teil der ständig angemeckert wird:

Code: Alles auswählen

   def read_config(self):
        choice, date, dest = None, None, None
        try:
            file = open(self.config_file)
            for line in file.readlines():
                if line.lower().strip().startswith("boottime"):
                    choice = re.split('^boottime\s*=\s*([0-9]+)', line.lower().strip())[1]
                elif line.lower().strip().startswith("destination="):
                    dest = re.split('^[dD][eE][sS][tT][iI][nN][aA][tT][iI][oO][nN]\s*=\s*(.+)\s*$', line.strip())[1].replace('\\', os.path.sep) #.replace('DAVID-NEU','mnt')
            file.close()
        except Exception, e:
            print >> sys.stderr, '''Error: File "%s" (configuration file) couldn't be read!\nQuitting.''' % self.config_file
            try:
                self.lock.remove()
            except Exception, e:
                pass
            exit(1)
        try:
            file = open(self.date_file)
            for line in file.readlines():
                if line.lower().strip().startswith("sidate"):
                    try:
                        date = time.mktime(time.strptime(re.split('^sidate\s*=([0-9]{2}\.[0-9]{2}\.[0-9]{4})?$', line.lower().strip())[1], '%d.%m.%Y'))
                        break
                    except Exception, e:
                        date = None
        except Exception, e:
            print >> sys.stderr, '''Error: File "%s" (configuration file) couldn't be read!\nQuitting.''' % self.date_file
            try:
                self.lock.remove()
            except Exception, e:
                pass
            exit(1)
        return choice, date, dest
Danke Black wusste nicht wie das geht. :)
Zuletzt geändert von Anonymous am Mittwoch 6. April 2011, 09:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@eyescube: Wie schon gesagt wurde ist es keine gute Idee einfach sehr grosszügig Ausnahmen abzufangen und dann zu ignorieren oder durch eine allgemeine Fehlermeldung zu ersetzen, die nichts mehr über die eigentliche Ursache verrät. Wenn man schon sehr grosszügig Ausnahmen behandelt, sollte man auch ausgeben welche genau aufgetreten ist. Bei Dir klappt das `open()` schon nicht weil es das Attribut `self.config_file` nicht gibt. Genau dieser `AttributeError` führt zu der Ausgabe das die Datei nicht gelesen werden kann. Nur kann die Meldung nicht ausgegeben werden, weil ja eben genau das `self.config_file` nicht existiert was Du in die Meldung einbauen willst.

Edit: Du scheinst `re.split()` zu Deiner Wunderwaffe erklärt zu haben -- das ist es nicht. Zumal durch die Vorprüfung mit `startswith()` auch mindestens ein regulärer Ausdruck viel zu weit und kompliziert gefasst ist. Wenn eine Zeichenkette mit 'destination=' beginnt, dann ist es unsinnig im regulären Ausdruck auf Grossbuchstaben und Leerraum vor dem '=' zu testen.

Die Methode macht zu viel auf einmal. Sie enthält zwei Quelltextblöcke die von der äusseren Struktur ziemlich gleich aussehen -- solche Wiederholungen sollte man vermeiden zum Beispiel in dem man gemeinsamen Code in eine Funktion heraus zieht oder die unterschiedlichen Daten über eine Schleife in den Code bringt.

Der `readline()`-Aufruf auf den Dateiobjekten ist unnötig weil Dateiobjekte "iterable" sind und beim iterieren die Zeilen in der Datei liefern.
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

ok hab nun von meinem alten noch funktionierenden Script den Teil nochma kopiert und das neue hinzugefügt und nun funktioniert es Vielen Dank. :mrgreen:
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

eyescube hat geschrieben:ok hab nun von meinem alten noch funktionierenden Script den Teil nochma kopiert und das neue hinzugefügt und nun funktioniert es
Schön für dich. Du solltest trotzdem die strukturellen Probleme, die Blackjack angesprochen hat, abarbeiten. Alleine schon dieses

Code: Alles auswählen

except Exception, e:
ist eine dauerhafte Quelle potenziellen Ärgers. Wenn du einen speziellen Fehler abfangen möchtest, dann gib ihn an. Ab Python 2.6 würde ich zudem die Syntax mit "as" verwenden:

Code: Alles auswählen

except KeyError as e:
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

ja ich merks es bleibt bei dem Fehler nun also werd ich wohl self.config rausschmeissn und einfach als "config" drin lassen wie soll ichs sonst abändern?...

Weiter oben was man am Code nicht sieht hab ich eingefügt:
if os.path.isabs(config_file)
self.config_file= config_file
also deklariert isses.

soll ich mal den Kompletten Code posten?
wenn ich das print auskommentier bekomm ich gar keine Fehler mehr.
10:40 Fehler beseitigt dafür is mir was anderes aufgefallen. also könnt Thread Schließen wenn ihr wollt.

config_file="datei.ini"
Zuletzt geändert von eyescube am Donnerstag 7. April 2011, 09:41, insgesamt 2-mal geändert.
BlackJack

@eyescube: Variablen/Attribute werden in Python nicht deklariert. Wenn man ein Attribut an einen Wert bindet, existiert es, wenn man das nicht tut, existiert es nicht. In den beiden Zeilen (die syntaktisch nicht ganz korrekt sind) hängt es ganz offensichtlich davon ab, ob `config_file` an einen absoluten Pfad gebunden ist, ob `self.config_file` an diesen Wert gebunden wird. Wird das denn irgendwo anders an einen Wert gebunden wenn `config_file` *kein* absoluter Pfad ist?
Antworten