Da sind noch viele Dinge verbesserungsbedürftig!
Grundsätzlich sollte man Skripte nicht auf Modulebene ausführen, da der Code so auch bei einem Import ausgeführt wird, was Probleme mit verschiedenen Tools verursacht (u.a. Unittests und pychecker). Stattdessen sollte man so vorgehen.
Auch wäre es im Sinne der Lesbarkeit von Vorteil, die Mischung von Deutsch und Englisch in Bezeichnern zu vermeiden. Nutze Deutsch oder Englisch, wobei Englisch die optimale Wahl wäre.
Auch die Benutzung von Funktionen ist zur Strukturierung anzuraten.
Zeile 10:
cfg.readfp(open('save.conf'))
Dieses Dateiobjekt kannst du mangels Referenz nie explizit schließen, obwohl das explizite Schließen zum guten Stil gehört. Nutze ein try-finally-Konstrukt oder das neue with Statement.
Zeile 26:
if len(comment) == 0:
Man sollte nie die Länge eines Strings prüfen, sondern ob er als Wahr ausgewertet wird:
if comment:
Zeile 27ff:
ziel = datum + os.sep +zeit
Man nutzt os.path.join zum Zusammensetzen von Pfaden.
Zeile 40ff:
if tar_gz == 'True':
Wenn du deine String-Konstante schon "True" nennst, kannst du auch gleich echte Boolsche Konstanten nehmen!
Zeile 47ff:
subprocess.call(order, shell = True) == 0:
Man sollte Unterprozesse nie über die Shell ausführen! So schlägt der Code beispielsweise fehl, sobald auch nur ein Dateinamen einen Apostroph (aka einfaches Anführungszeichen) enthält, was z.B. in meiner Musiksammlung häufig der Fall ist. Wenn du schon Unterprozesse ausführen willst, baue eine Liste für die Argumente und übergebe diese an subprocess:
args = ['tar', 'czvf', target]
args.expand(sources)
try:
subprocess.check_call(args)
except subprocess.CalledProcessError:
print 'calling subprocess failed'
Am besten wäre es natürlich, die eingebauten Python-Module zum Archivieren zu verwenden. Dann funktioniert der Code nämlich unter jedem Betriebssystem, auch unter Windows, wo es tar nicht gibt 😉
Die If-Abfragen kannst du dir ganz sparen, wenn du eine Einstellung "archive_format" einführst, die einen String aufnimmt. Den entsprechende Archivierungsvorgang lagerst du dann in Funktionen aus. Dann kannst du ein Dictionary verwenden, um das Format der Funktion zuzuordnen:
def do_zip(target, sources):
# do zipping here
def do_gztar(target, sources):
# do gz tar compression here
def do_bztar(target, sources):
# do bz tar compression here
formats = {
'zip': do_zip,
'bztar': do_bztar,
'gztar': do_gztar
}
formats[archive_format](target, sources)
Dieser Code ist kürzer, leichter wartbar und besser lesbar.
Das sind so die Dinge, die mir beim Drüberschauen aufgefallen sind. Ich meine allerdings, mich zu erinnern, dass ich dir das meiste davon schon mal gesagt habe 😉