Problemlösung#
Wir haben verschiedene Teile der Python-Sprache untersucht und nun werden wir einen Blick darauf werfen, wie all diese Teile zusammenpassen, indem wir ein Programm entwerfen und schreiben, das etwas Nützliches tut. Die Idee besteht darin, zu lernen, wie man ein Python-Skript selbstständig schreibt.
Das Problem#
Das Problem, das wir lösen wollen, lautet:
Ich möchte ein Programm, das ein Backup all meiner wichtigen Dateien erstellt.
Obwohl dies ein einfaches Problem ist, gibt es nicht genügend Informationen, um mit der Lösung zu beginnen. Es ist ein wenig mehr Analyse erforderlich. Zum Beispiel: Wie geben wir an, welche Dateien gesichert werden sollen? Wie werden sie gespeichert? Wohin werden sie gespeichert?
Nachdem wir das Problem richtig analysiert haben, entwerfen (design) wir unser Programm. Wir erstellen eine Liste von Dingen, wie unser Programm funktionieren soll. In diesem Fall habe ich die folgende Liste erstellt, wie ich möchte, dass es funktioniert. Wenn Sie selbst das Design erstellen, kommen Sie möglicherweise zu einer anderen Analyse, da jede Person ihre eigene Art hat, Dinge zu tun – das ist völlig in Ordnung.
Die zu sichernden Dateien und Verzeichnisse werden in einer Liste angegeben.
Das Backup muss in einem Haupt-Backup-Verzeichnis gespeichert werden.
Die Dateien werden in eine ZIP-Datei gesichert.
Der Name des ZIP-Archivs ist das aktuelle Datum und die Uhrzeit.
Wir verwenden den standardmäßigen
zip-Befehl, der in jeder üblichen GNU/Linux- oder Unix-Distribution verfügbar ist. Beachten Sie, dass Sie jeden beliebigen Archivierungsbefehl verwenden können, solange er über eine Kommandozeilenschnittstelle verfügt.
Für Windows-Benutzer
Windows-Benutzer können den zip-Befehl über die GnuWin32-Projektseite installieren und C:\Program Files\GnuWin32\bin zu ihrer PATH-Umgebungsvariable hinzufügen, ähnlich wie wir es getan haben, um den python-Befehl selbst zu erkennen (siehe Installation).
Die Lösung#
Da das Design unseres Programms nun ausreichend stabil ist, können wir den Code schreiben, der eine Implementierung unserer Lösung darstellt.
Beispiel backup_ver1_de.py
Quellcode
1import os
2import time
3
4# 1. Die Dateien und Ordner zum sichern sind in dieser Liste:
5# Beispiel für Windows:
6# quell_ordner = ['"C:\\Meine Dokumente"']
7# Beachte die doppelten Anführungszeichen im String ( '"C:\\My Documents"' )
8# Weil der String (bzw der Dateiname) Leerzeichen enthält.
9# Alternativ kann man auch einen raw string benutzen:
10# [r'C:\Meine Dokumente'].
11
12# Beispiel für Mac OS X and Linux:
13quell_ordner = ['/home/horst/Documents/rudi'] # hier eigenen Pfad eingeben
14
15
16# 2. Die Sicherheitskopie ("backup") muss in einem eigenen Ordner
17# gespeichert werden
18# Beispiel für Windows:
19# ziel_ordner = 'E:\\Backup'
20# Beispiel für Mac OS X und Linux:
21ziel_ordner = '/home/horst/Backups' # hier eigenen Pfad eingeben!
22# Nicht vergessen: Ordnernamen (Path) an die eigenen Bedürfnisse anpassen
23
24# 3. Die Dateien werden in ein zip-file gepackt.
25# 4. Der Name vom zip-file ist das aktuelle Datum und die Uhrzeit
26ziel = ziel_ordner + os.sep + \
27 time.strftime('%Y%m%d%H%M%S') + '.zip'
28
29# Erzeuge den Ziel-Ordner falls er noch nicht existiert
30if not os.path.exists(ziel_ordner):
31 os.mkdir(ziel_ordner) # mdkir steht für 'make directory'
32
33# 5. Das zip kommando benutzen um die Dateien ins zip-archiv zu kopieren
34zip_command = 'zip -r {0} {1}'.format(ziel,' '.join(quell_ordner))
35
36# Run the backup
37print('Das Zip command lautet:')
38print(zip_command)
39print('Ausführung:')
40if os.system(zip_command) == 0:
41 print('Backup erfolgreich in Datei:', ziel)
42else:
43 print('Backup abgebrochen (Fehler)')
Die Zeilennummern sind nicht Bestandteil des Quellcodes
Ausgabe
$ python backup_de.py
Das Zip command lautet:
zip -r /home/horst/Backups/20260512143235.zip /home/horst/Documents/rudi
Ausführung:
adding: home/horst/Documents/rudi/ (stored 0%)
adding: home/horst/Documents/rudi/gerburtstagseinladung4.pdf (deflated 1%)
adding: home/horst/Documents/rudi/gerburtstagseinladung4.svg (deflated 25%)
adding: home/horst/Documents/rudi/spielmusik_anmeldung_2.pdf (deflated 0%)
adding: home/horst/Documents/rudi/Elternbrief neues Anmeldesystem _1_.pdf (deflated 8%)
adding: home/horst/Documents/rudi/spielemusik_anmeldung_rudolf_JENS.pdf (deflated 0%)
adding: home/horst/Documents/rudi/spielmusik_anmeldung_1.pdf (deflated 0%)
Backup erfolgreich in Datei: /home/horst/Backups/20260512143235.zip
Nun befinden wir uns in der Testphase, in der wir prüfen, ob unser Programm korrekt funktioniert. Wenn es sich nicht wie erwartet verhält, müssen wir unser Programm debuggen, d. h. die Fehler (bugs) aus dem Programm entfernen.
Wenn das obige Programm bei Ihnen nicht funktioniert, kopieren Sie die Zeile, die nach der Ausgabe des Zip command ist erscheint, fügen Sie sie in die Shell (unter GNU/Linux und macOS) bzw. in cmd (unter Windows) ein, sehen Sie nach, was der Fehler ist, und versuchen Sie, ihn zu beheben. Prüfen Sie auch im Handbuch des zip-Befehls, was falsch sein könnte. Wenn dieser Befehl funktioniert, könnte das Problem im Python-Programm selbst liegen. Prüfen Sie dann, ob es exakt mit dem oben aufgeführten Programm übereinstimmt.
Wie es funktioniert:
Sie werden bemerken, wie wir unser Design Schritt für Schritt in Code umgesetzt haben.
Wir verwenden die Module os und time, indem wir sie zuerst importieren. Dann geben wir die zu sichernden Dateien und Verzeichnisse in der Liste quell_ordner an. Das Zielverzeichnis, in dem wir alle Backup-Dateien speichern, wird in der Variablen ziel_ordner angegeben. Der Name des ZIP-Archivs, das wir erstellen wollen, ist das aktuelle Datum und die Uhrzeit, die wir mit der Funktion time.strftime() erzeugen. Es erhält auch die Endung .zip und wird im Verzeichnis ziel_ordner gespeichert.
Beachten Sie die Verwendung der Variablen os.sep – sie liefert das für Ihr Betriebssystem passende Verzeichnistrennzeichen, d. h. '/' für GNU/Linux, Unix und macOS bzw. '\\' für Windows. Die Verwendung von os.sep anstelle dieser Zeichen direkt macht unser Programm portabel und funktionstüchtig auf allen diesen Systemen.
Die Funktion time.strftime() verwendet ein Format wie das, das wir im obigen Programm benutzt haben. Die Angabe %Y wird durch das Jahr mit Jahrhundert ersetzt. Die Angabe %m wird durch den Monat als Dezimalzahl zwischen 01 und 12 ersetzt usw. Die vollständige Liste solcher Angaben finden Sie im Python Reference Manual.
Wir erstellen den Namen der Ziel-ZIP-Datei mit dem Addition-Operator, der Zeichenketten konkateniert ( concatenates_), d. h. sie miteinander verbindet und eine neue Zeichenkette zurückgibt. Dann erstellen wir eine Zeichenkette zip_command, die den Befehl enthält, den wir ausführen werden. Sie können prüfen, ob dieser Befehl funktioniert, indem Sie ihn in der Shell (GNU/Linux-Terminal oder DOS-Eingabeaufforderung) ausführen.
Der von uns verwendete zip-Befehl verfügt über einige Optionen, darunter die Option -r. Die Option -r gibt an, dass der zip-Befehl rekursiv für Verzeichnisse arbeiten soll, d. h. er soll alle Unterverzeichnisse und Dateien einbeziehen. Auf die Optionen folgen der Name des zu erstellenden ZIP-Archivs sowie die Liste der zu sichernden Dateien und Verzeichnisse. Wir wandeln die Liste quell_ordner mit der Methode join von Strings in eine Zeichenkette um, deren Verwendung wir bereits kennengelernt haben.
Dann führen wir den Befehl schließlich mit der Funktion os.system aus, die den Befehl so ausführt, als wäre er vom System aufgerufen worden, d. h. in der Shell – sie gibt 0 zurück, wenn der Befehl erfolgreich war, andernfalls eine Fehlernummer.
Abhängig vom Ergebnis des Befehls geben wir die entsprechende Meldung aus, ob das Backup fehlgeschlagen oder erfolgreich war.
Das war’s – wir haben ein Skript erstellt, um eine Sicherung unserer wichtigen Dateien zu erstellen!
Hinweis für Windows-Benutzer
Anstelle doppelter Backslash-Escape-Sequenzen können Sie auch Raw-Strings verwenden. Beispiel: 'C:\\Documents' oder r'C:\Documents'. Verwenden Sie jedoch nicht 'C:\Documents', weil Sie sonst eine unbekannte Escape-Sequenz \D verwenden.
Nun, da wir ein funktionierendes Backup-Skript haben, können wir es verwenden, wann immer wir ein Backup der Dateien anlegen möchten. Dies nennt man die Betriebsphase oder Deployment-Phase der Software.
Das obige Programm funktioniert, aber (normalerweise) funktionieren Erstprogramme nicht genau so, wie Sie es erwarten. Beispielsweise kann es Probleme geben, wenn Sie das Programm nicht korrekt entworfen haben oder wenn Sie einen Tippfehler im Code gemacht haben. In diesem Fall müssen Sie zum Design zurückkehren oder das Programm debuggen.
Zweite Version#
Die erste Version unseres Skripts funktioniert. Dennoch können wir einige Verfeinerungen daran vornehmen, damit es im täglichen Einsatz besser funktioniert. Dies nennt man die Wartungsphase der Software.
Eine der sinnvollen Verfeinerungen ist ein besserer Mechanismus zur Dateibenennung – die Verwendung der Uhrzeit als Dateiname innerhalb eines Verzeichnisses, dessen Name das aktuelle Datum ist, innerhalb des Haupt-Backup-Verzeichnisses. Der erste Vorteil besteht darin, dass Ihre Backups hierarchisch gespeichert werden und somit viel einfacher zu verwalten sind. Der zweite Vorteil ist, dass die Dateinamen viel kürzer sind. Der dritte Vorteil besteht darin, dass separate Verzeichnisse Ihnen helfen können zu prüfen, ob Sie für jeden Tag ein Backup erstellt haben, da das Verzeichnis nur erstellt wird, wenn Sie für diesen Tag ein Backup gemacht haben.
Beispiel backup_ver2_de.py
Quellcode
1import os
2import time
3
4# 1. Die Dateien und Ordner zum sichern sind in dieser Liste:
5# Beispiel für Windows:
6# quell_ordner = ['"C:\\Meine Dokumente"', 'C:\\Code']
7# Beachte die doppelten Anführungszeichen im String ( '"C:\\Meine Dokumente"' )
8# Weil der String (bzw der Dateiname) Leerzeichen enthält.
9# Alternativ kann man auch einen raw string benutzen:
10# [r'C:\Meine Dokumente'].
11
12# Beispiel für Mac OS X and Linux:
13quell_ordner = ['/home/horst/Documents/rudi'] # Pfad anpassen!
14
15
16# 2. Die Sicherheitskopie ("backup") muss in einem eigenen Ordner
17# gespeichert werden
18# Beispiel für Windows:
19# ziel_ordner = 'E:\\Backup'
20# Beispiel für Mac OS X und Linux:
21ziel_ordner = '/home/horst/Backups'
22# Nicht vergessen: Ordnernamen (Path) an die eigenen Bedürfnisse anpassen
23
24# 3. Die Dateien werden in ein zip-file gepackt.
25# 4. Der Name vom zip-file ist das aktuelle Datum und die Uhrzeit
26heute = time.strftime('%Y%m%d') # year, month, day
27jetzt = time.strftime('%H%M%S') # hour, minute, second
28ziel = ziel_ordner + os.sep + heute + os.sep + jetzt + ".zip"
29
30
31# Erzeuge den Ziel-Ordner (Backups) falls er noch nicht existiert
32if not os.path.exists(ziel_ordner):
33 os.mkdir(ziel_ordner) # mdkir steht für 'make directory'
34# Erzeuge (innerhalb von Backups) einen Ordner (YMT) falls er noch nicht existiert
35if not os.path.exists(ziel_ordner + os.sep + heute):
36 os.mkdir(ziel_ordner + os.sep + heute )
37
38# 5. Das zip kommando benutzen um die Dateien ins zip-archiv zu kopieren
39zip_command = 'zip -r {0} {1}'.format(ziel,' '.join(quell_ordner))
40
41# Run the backup
42print('Das Zip command lautet:')
43print(zip_command)
44print('Ausführung:')
45if os.system(zip_command) == 0:
46 print('Backup erfolgreich in Datei:', ziel)
47else:
48 print('Backup abgebrochen (Fehler)')
Die Zeilennummern sind nicht Bestandteil des Quellcodes
Ausgabe
$ python backup_ver2_de.py
Successfully created directory /Users/swa/backup/20140329
Das Zip command lautet::
zip -r /Users/swa/backup/20140329/073201.zip /Users/swa/notes
Ausführung:
adding: Users/swa/notes/ (stored 0%)
adding: Users/swa/notes/blah1.txt (stored 0%)
adding: Users/swa/notes/blah2.txt (stored 0%)
adding: Users/swa/notes/blah3.txt (stored 0%)
Backup erfolgreich in Datei: /Users/swa/backup/20140329/073201.zip
Wie es funktioniert:
Der größte Teil des Programms bleibt gleich. Die Veränderungen bestehen darin, dass wir mit der Funktion os.path.exists prüfen, ob ein Verzeichnis mit dem aktuellen Tagesdatum als Namen im Haupt-Backup-Verzeichnis existiert. Wenn es nicht existiert, erstellen wir es mit der Funktion os.mkdir.
Dritte Version#
Die zweite Version funktioniert gut, wenn ich viele Backups mache, aber wenn es sehr viele Backups gibt, fällt es mir schwer zu unterscheiden, wofür die Backups waren! Wenn ich zum Beispiel größere Änderungen an einem Programm oder einer Präsentation vorgenommen habe, möchte ich diese Änderungen mit dem Namen des ZIP-Archivs verknüpfen. Dies kann leicht erreicht werden, indem man dem Namen des ZIP-Archivs einen vom Benutzer angegebenen Kommentar hinzufügt.
Warnung
Das folgende Programm funktioniert nicht, also seien Sie nicht beunruhigt – bitte folgen Sie weiter, da hier eine wichtige Lektion enthalten ist.
Beispiel backup_ver3_de.py
Quellcode
1import os
2import time
3
4# 1. Die Dateien und Ordner zum sichern sind in dieser Liste:
5# Beispiel für Windows:
6# quell_ordner = ['"C:\\Meine Dokumente"', 'C:\\Code']
7# Beachte die doppelten Anführungszeichen im String ( '"C:\\Meine Dokumente"' )
8# Weil der String (bzw der Dateiname) Leerzeichen enthält.
9# Alternativ kann man auch einen raw string benutzen:
10# [r'C:\Meine Dokumente'].
11
12# Beispiel für Mac OS X and Linux:
13quell_ordner = ['/home/horst/Documents/rudi'] # Pfad anpassen!
14
15
16# 2. Die Sicherheitskopie ("backup") muss in einem eigenen Ordner
17# gespeichert werden
18# Beispiel für Windows:
19# ziel_ordner = 'E:\\Backup'
20# Beispiel für Mac OS X und Linux:
21ziel_ordner = '/home/horst/Backups'
22# Nicht vergessen: Ordnernamen (Path) an die eigenen Bedürfnisse anpassen
23
24# 3. Die Dateien werden in ein zip-file gepackt.
25# 4. Der Name vom zip-file ist das aktuelle Datum und die Uhrzeit
26heute = time.strftime('%Y%m%d') # year, month, day
27jetzt = time.strftime('%H%M%S') # hour, minute, second
28# Benutzer nach Kommentar fragen
29kommentar = input("Gib einen Kommentar ein (und drücke die ENTER Taste) >>>")
30# wurde wirklich etwas eingegeben ?
31if len(kommentar) == 0: # es wurde nur auf die Enter Taste gedrückt
32 ziel = ziel_ordner + os.sep + heute + os.sep + jetzt + ".zip"
33else: # es wurde ein Kommentar eingegeben
34 kommentar = kommentar.replace(" ", "_") # Leerzeichen durch Unterstriche ersetzten
35 ziel = ziel_ordner + os.sep + heute + os.sep + jetzt + "_" +
36 kommentar + ".zip"
37
38# Erzeuge den Ziel-Ordner (Backups) falls er noch nicht existiert
39if not os.path.exists(ziel_ordner):
40 os.mkdir(ziel_ordner) # mdkir steht für 'make directory'
41# Erzeuge (innerhalb von Backups) einen Ordner (YMT) falls er noch nicht existiert
42if not os.path.exists(ziel_ordner + os.sep + heute):
43 os.mkdir(ziel_ordner + os.sep + heute )
44
45# 5. Das zip kommando benutzen um die Dateien ins zip-archiv zu kopieren
46zip_command = 'zip -r {0} {1}'.format(ziel,' '.join(quell_ordner))
47
48# Run the backup
49print('Das Zip command lautet:')
50print(zip_command)
51print('Ausführung:')
52if os.system(zip_command) == 0:
53 print('Backup erfolgreich in Datei:', ziel)
54else:
55 print('Backup abgebrochen (Fehler)')
Die Zeilennummern sind nicht Bestandteil des Quellcodes
Ausgabe
$ python3 backup_ver3_de.py
File "/home/horst/code/byte-of-python_deutsch_horst/programs/backup_ver3_de.py", line 33
ziel = ziel_ordner + os.sep + heute + os.sep + jetzt + "_" +
^
SyntaxError: invalid syntax
Warum es (nicht) funktioniert:
Dieses Programm funktioniert nicht! Python meldet einen Syntaxfehler (syntax error), was bedeutet, dass das Skript nicht der Struktur entspricht, die Python erwartet. Wenn wir die von Python ausgegebene Fehlermeldung betrachten, teilt sie uns auch die Stelle mit, an der der Fehler erkannt wurde. Daher beginnen wir an dieser Zeile mit dem Debugging unseres Programms.
Bei genauer Beobachtung stellen wir fest, dass eine logische Zeile in zwei physische Zeilen aufgeteilt wurde, wir aber nicht angegeben haben, dass diese beiden physischen Zeilen zusammengehören. Python hat im Grunde den Additionsoperator (+) ohne Operanden in dieser logischen Zeile gefunden und weiß daher nicht, wie es fortfahren soll. Denken Sie daran, dass wir angeben können, dass die logische Zeile in der nächsten physischen Zeile weitergeht, indem wir am Ende der physischen Zeile einen Backslash verwenden. Also nehmen wir diese Korrektur an unserem Programm vor. Diese Korrektur, die wir durchführen, wenn wir Fehler finden, nennt man Bugfixing.
Vierte Version#
Beispiel backup_ver4_de.py
Quellcode
1import os
2import time
3
4# 1. Die Dateien und Ordner zum sichern sind in dieser Liste:
5# Beispiel für Windows:
6# quell_ordner = ['"C:\\Meine Dokumente"', 'C:\\Code']
7# Beachte die doppelten Anführungszeichen im String ( '"C:\\Meine Dokumente"' )
8# Weil der String (bzw der Dateiname) Leerzeichen enthält.
9# Alternativ kann man auch einen raw string benutzen:
10# [r'C:\Meine Dokumente'].
11
12# Beispiel für Mac OS X and Linux:
13quell_ordner = ['/home/horst/Documents/rudi'] # Pfad anpassen!
14
15
16# 2. Die Sicherheitskopie ("backup") muss in einem eigenen Ordner
17# gespeichert werden
18# Beispiel für Windows:
19# ziel_ordner = 'E:\\Backup'
20# Beispiel für Mac OS X und Linux:
21ziel_ordner = '/home/horst/Backups'
22# Nicht vergessen: Ordnernamen (Path) an die eigenen Bedürfnisse anpassen
23
24# 3. Die Dateien werden in ein zip-file gepackt.
25# 4. Der Name vom zip-file ist das aktuelle Datum und die Uhrzeit
26heute = time.strftime('%Y%m%d') # year, month, day
27jetzt = time.strftime('%H%M%S') # hour, minute, second
28# Benutzer nach Kommentar fragen
29kommentar = input("Gib einen Kommentar ein (und drücke die ENTER Taste) >>>")
30# wurde wirklich etwas eingegeben ?
31if len(kommentar) == 0: # es wurde nur auf die Enter Taste gedrückt
32 ziel = ziel_ordner + os.sep + heute + os.sep + jetzt + ".zip"
33else: # es wurde ein Kommentar eingegeben
34 kommentar = kommentar.replace(" ", "_") # Leerzeichen durch Unterstriche ersetzten
35 ziel = ziel_ordner + os.sep + heute + os.sep + jetzt + "_" + \
36 kommentar + ".zip"
37
38# Erzeuge den Ziel-Ordner (Backups) falls er noch nicht existiert
39if not os.path.exists(ziel_ordner):
40 os.mkdir(ziel_ordner) # mdkir steht für 'make directory'
41# Erzeuge (innerhalb von Backups) einen Ordner (YMT) falls er noch nicht existiert
42if not os.path.exists(ziel_ordner + os.sep + heute):
43 os.mkdir(ziel_ordner + os.sep + heute )
44
45# 5. Das zip kommando benutzen um die Dateien ins zip-archiv zu kopieren
46zip_command = 'zip -r {0} {1}'.format(ziel,' '.join(quell_ordner))
47
48# Run the backup
49print('Das Zip command lautet:')
50print(zip_command)
51print('Ausführung:')
52if os.system(zip_command) == 0:
53 print('Backup erfolgreich in Datei:', ziel)
54else:
55 print('Backup abgebrochen (Fehler)')
Die Zeilennummern sind nicht Bestandteil des Quellcodes
Ausgabe
$ python3 backup_ver4_de.py
Gib einen Kommentar ein (und drücke die ENTER Taste) >>>neue Beispieldatei
Das Zip command lautet:
zip -r /home/horst/Backups/20260512/144752_neue_Beispieldatei.zip /home/horst/Documents/rudi
Ausführung:
adding: home/horst/Documents/rudi/ (stored 0%)
adding: home/horst/Documents/rudi/gerburtstagseinladung4.pdf (deflated 1%)
adding: home/horst/Documents/rudi/gerburtstagseinladung4.svg (deflated 25%)
adding: home/horst/Documents/rudi/spielmusik_anmeldung_2.pdf (deflated 0%)
adding: home/horst/Documents/rudi/Elternbrief neues Anmeldesystem _1_.pdf (deflated 8%)
adding: home/horst/Documents/rudi/spielemusik_anmeldung_rudolf_JENS.pdf (deflated 0%)
adding: home/horst/Documents/rudi/spielmusik_anmeldung_1.pdf (deflated 0%)
Backup erfolgreich in Datei: /home/horst/Backups/20260512/144752_neue_Beispieldatei.zip
Wie es funktioniert:
Dieses Programm funktioniert jetzt! Gehen wir die tatsächlichen Erweiterungen durch, die wir in Version 3 vorgenommen hatten. Wir holen die Kommentare des Benutzers mit der Funktion input ein und prüfen dann, ob der Benutzer tatsächlich etwas eingegeben hat, indem wir die Länge der Eingabe mit der Funktion len bestimmen. Wenn der Benutzer lediglich die Eingabetaste gedrückt hat, ohne etwas einzugeben (vielleicht war es nur ein Routine-Backup oder es wurden keine besonderen Änderungen vorgenommen), fahren wir wie zuvor fort.
Wenn jedoch ein Kommentar eingegeben wurde, wird dieser dem Namen des ZIP-Archivs unmittelbar vor der .zip-Endung hinzugefügt. Beachten Sie, dass wir Leerzeichen im Kommentar durch Unterstriche ersetzen – das liegt daran, dass das Verwalten von Dateinamen ohne Leerzeichen wesentlich einfacher ist.
Weitere Verfeinerungen#
Die vierte Version ist für die meisten Benutzer ein zufriedenstellend funktionierendes Skript, aber es gibt immer Raum für Verbesserungen. Sie könnten zum Beispiel für den zip-Befehl eine Ausführlichkeitsstufe hinzufügen, indem Sie die Option -v (für verbose, geschwätzig) festlegen, um Ihr Programm gesprächiger zu machen, oder die Option -q (für quiet, ruhig), um es ruhig zu machen.
Eine weitere mögliche Verbesserung wäre, dem Skript das Übergeben zusätzlicher Dateien und Verzeichnisse über die Befehlszeile zu erlauben. Wir können diese Namen aus der Liste sys.argv erhalten und sie unserer source-Liste mit der Methode extend, die von der Klasse list bereitgestellt wird, hinzufügen.
Die wichtigste Verfeinerung wäre es, nicht den Weg über os.system zum Erstellen von Archiven zu verwenden, sondern stattdessen die eingebauten Module zipfile oder tarfile zum Erstellen dieser Archive zu verwenden. Sie sind Teil der Standardbibliothek und bereits ohne externe Abhängigkeiten verfügbar.
Ich habe jedoch in den obigen Beispielen die Verwendung von os.system zum Erstellen eines Backups ausschließlich zu didaktischen Zwecken gewählt, damit das Beispiel einfach genug bleibt, um von jedem verstanden zu werden, aber real genug, um nützlich zu sein.
Können Sie versuchen, die fünfte Version zu schreiben, die das Modul zipfile anstelle des Aufrufs os.system verwendet?
Der Softwareentwicklungsprozess#
Wir haben nun die verschiedenen Phasen des Schreibens einer Software durchlaufen. Diese Phasen lassen sich wie folgt zusammenfassen:
Was (Analyse)
Wie (Design)
Tun (Implementierung)
Testen (Test und Debugging)
Verwenden (Betrieb oder Deployment)
Pflegen (Verfeinerung)
Eine empfohlene Methode beim Schreiben von Programmen ist die Vorgehensweise, die wir beim Erstellen des Backup-Skripts verwendet haben: Führen Sie Analyse und Design durch. Beginnen Sie mit einer einfachen Version der Implementierung. Testen und debuggen Sie sie. Verwenden Sie sie, um sicherzustellen, dass sie wie erwartet funktioniert. Fügen Sie dann die gewünschten Funktionen hinzu und wiederholen Sie den Tun-Testen-Verwenden-Zyklus so oft wie nötig.
Denken Sie daran:
Software wird gepflegt und weiterentwickelt, nicht „gebaut“.
Zusammenfassung#
Wir haben gesehen, wie wir unsere eigenen Python-Programme/Skripte erstellen können und welche verschiedenen Schritte beim Schreiben solcher Programme beteiligt sind. Es könnte für Sie hilfreich sein, ein eigenes Programm zu entwickeln, genau wie wir es in diesem Kapitel getan haben, damit Sie sowohl mit Python als auch mit Problemlösung vertraut werden.
Als Nächstes werden wir objektorientierte Programmierung behandeln.