Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Erste Skripte
In diesem Abschnitt geht es darum zu lernen, wie man Python-Skripte erstellt und startet. Ausgehend von einem ersten einfachen Beispiel entwickeln wir im zweiten Beispiel das Programm weiter und zeigen, wie durch das Anlegen einer Projektstruktur (und von Modulen) sowie einer Python-Umgebung eine professionelle Arbeitsweise möglich wird. Nach dem Durcharbeiten dieser Seite kann mit den eigentlichen Projekten begonnen werden.
- Einfache Python-Skripte
- Anlegen und Nutzen einer env
- Erstellen und Ausführen von Python-Skripten
- Einbinden und Gebrauch von Modulen
- Projektstruktur und Arbeiten mit mehreren Dateien
Example 1: reflexio
Aufgabe - „Schnell, schneller, am schnellsten“
Schreibe ein Python-Programm (reflexio), das Reaktionszeiten messen kann.
- Beim Start soll eine kleine Anleitung erscheinen.
- Anschließend soll der User möglichst schnell reagieren, um die Messung zu stoppen.
- Das Ergebnis soll auf der Kommandozeile sichtbar sein.
Quellcode
- reflexio.py
#!/usr/bin/env python3 # Testet die Reaktionszeit # @author: DEIN NAME # @version: 1.0 # @usage: ./reflexio.py import time import random VERSION = "This is reflexio v.1.0" def main(): print(VERSION) print("============== ANLEITUNG ===============================-") print("(1) Drücke 'ENTER', um die Messung zu starten.") print("(2) Drücke 'ENTER', sobald die Meldung 'JETZT' erscheint!") print("==========================================================") print("") input() print("Status: ...Messung läuft\n") wartezeit = random.uniform(2, 6) time.sleep(wartezeit) print("JETZT!") start = time.time() input() ende = time.time() reaktion = ende - start print("Status: ...Messung beendet") print(f"Deine Reaktionszeit: {reaktion:.3f} Sekunden") if __name__ == "__main__": main()
Programm ausführen
Damit ein Python-Skript per './reflexio' ausführbar ist, müssen die unten aufgeführten Punkte erfüllt sein.
- Erste Zeile (Shebang) in die Datei einfügen:
#!/usr/bin/env python3 - Datei ausführbar machen:
chmod +x reflexio - Starten: .
/reflexio
Example 1: reflexio-advanced
Aufgabe – „Schnell, schneller, am schnellsten“
Schreibe ein Python-Programm (reflexio-advanced), das Reaktionszeiten misst, diese optional sammelt und in einer gemeinsamen Datei speichert. Auf diese Weise soll beispielsweise der Mittelwert vieler einzelner Messungen berechnet werden können.
- Beim Start soll eine kleine Anleitung erscheinen.
- Der User kann zwischen Einzelmessung, Mittelwert anzeigen oder Reset wählen.
- Anschließend soll der User möglichst schnell reagieren, um die Messung zu stoppen.
- Das Ergebnis der Einzelmessung soll auf der Kommandozeile sichtbar sein.
- Zusätzlich soll – falls gewählt – der aktuelle Durchschnitt aller gespeicherten Messungen angezeigt werden.
- Alle Messungen sollen in einer gemeinsamen Datei gespeichert werden (eine Datei für alle Werte).
- Der User soll die Möglichkeit haben, alle gespeicherten Messungen zurückzusetzen (Reset der Datei).
Environment anlegen
Aufgabe: Anlegen einer Python-Environment
Lege eine Umgebung
~/devel/projects/refexio_advanced/refexio_advanced_envan.
Hierfür muss der Ordner ~/devel/projects/refexio_advanced bereits vorhanden sein.
Wechsle anschließend in die Umgebung, um das Example zu bearbeiten!
Programmstruktur anlegen
Hauptverzeichnis des Projekts: reflexio-advancded
pi@raspi88:~/devel/projects/reflexio_advanced $ pwd /home/pi/devel/projects/reflexio_advanced
Programmstrukur
└── reflexio_advanced # python3 -m venv reflexio_advanced_env ├── reflexio_advanced_env │ └── ... └── data # Ordner für die Messwerte (messwerte.txt) └── src # Ordner für den Quellcode ├── core # core-Verzeichnis │ ├── __init__.py # Erforderlich für Python! │ └── logic.py # Programm-Logik └── reflexio_advanced.py # Main Programm
Quellcode
Logik
import time import random import os def messung_starten(): print("\nDrücke 'ENTER', um die Messung zu starten.") input() print("Status: ...Messung läuft\n") time.sleep(random.uniform(2, 6)) print("JETZT!") start = time.perf_counter() input() ende = time.perf_counter() return ende - start def wert_speichern(datei, wert): with open(datei, "a") as f: f.write(str(wert) + "\n") def werte_laden(datei): if not os.path.exists(datei): return [] werte = [] with open(datei, "r") as f: for zeile in f: zeile = zeile.strip() if zeile != "": werte.append(float(zeile)) return werte def mittelwert_berechnen(werte): if len(werte) == 0: return None return sum(werte) / len(werte) def datei_reset(datei): if os.path.exists(datei): os.remove(datei) return True return False
Hauptprogramm
#!/usr/bin/env python3 import os from core.logic import ( messung_starten, wert_speichern, werte_laden, mittelwert_berechnen, datei_reset, ) VERSION = "This is reflexio-advanced v1.0" BASE_DIR = os.path.dirname(os.path.dirname(__file__)) DATA_DIR = os.path.join(BASE_DIR, "data") DATEI = os.path.join(DATA_DIR, "messungen.txt") os.makedirs(DATA_DIR, exist_ok=True) def help(): print("============== ANLEITUNG ===============================") print("(1) Einzelmessung durchführen") print(" -> Startet eine neue Reaktionsmessung.") print(" Der Wert wird gespeichert und der") print(" aktuelle Durchschnitt angezeigt.") print("") print("(2) Mittelwert anzeigen") print(" -> Zeigt Anzahl und Durchschnitt aller") print(" gespeicherten Messungen.") print("") print("(3) Messungen zurücksetzen (Reset)") print(" -> Löscht alle gespeicherten Werte.") print("") print("(0) Programm beenden") print("=========================================================") def main(): print(VERSION) help() while True: wahl = input("\nAuswahl: ") if wahl == "1": reaktion = messung_starten() print("Status: ...Messung beendet") print(f"Deine Reaktionszeit: {reaktion:.3f} Sekunden") wert_speichern(DATEI, reaktion) werte = werte_laden(DATEI) mw = mittelwert_berechnen(werte) print(f"Anzahl Messungen: {len(werte)}") print(f"Durchschnitt: {mw:.3f} Sekunden") elif wahl == "2": werte = werte_laden(DATEI) mw = mittelwert_berechnen(werte) if mw is None: print("Noch keine Messungen vorhanden.") else: print(f"Anzahl Messungen: {len(werte)}") print(f"Durchschnitt: {mw:.3f} Sekunden") elif wahl == "3": if datei_reset(DATEI): print("Alle Messungen wurden gelöscht.") else: print("Es existieren keine gespeicherten Messungen.") elif wahl == "0": print("Programm beendet.") break else: print("Ungültige Eingabe.") help() if __name__ == "__main__": main()
