Benutzer-Werkzeuge

Webseiten-Werkzeuge


projekt:python_erste_skripte

Dies ist eine alte Version des Dokuments!


Erste Skripte

☚ zurück

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.

  1. Erste Zeile (Shebang) in die Datei einfügen: #!/usr/bin/env python3
  2. Datei ausführbar machen: chmod +x reflexio
  3. 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_env an.

Hierfür muss der Ordner ~/devel/projects/refexio_advanced bereits vorhanden sein.

Das Anlegen und Managen einer Umgebung ist hier Python ENV ausführlich beschrieben.

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!
        │   └── utility.py        # Hilfsfunktionen        
        │   └── logic.py          # Programm-Logik
        └── reflexio_advanced.py  # Main Programm

Quellcode

Logik

# =========================================================
# File: src/core/logic.py
# =========================================================
 
import time
import random
import os
 
 
def start_measurement():
    print("\nDrücke 'ENTER', um die Messung zu starten.")
    input()
    print("Status: Warte auf das Signal...\n")
 
    time.sleep(random.uniform(2, 6))
 
    print("JETZT!")
 
    start = time.perf_counter()
    input()
    end = time.perf_counter()
 
    return end - start
 
 
def save_value(file_path, value):
    with open(file_path, "a") as f:
        f.write(f"{value}\n")
 
 
def load_values(file_path):
    if not os.path.exists(file_path):
        return []
 
    values = []
    with open(file_path, "r") as f:
        for line in f:
            line = line.strip()
            if line:
                values.append(float(line))
    return values
 
 
def calculate_average(values):
    if not values:
        return None
    return sum(values) / len(values)
 
 
def reset_data(file_path):
    if os.path.exists(file_path):
        os.remove(file_path)
        return True
    return False

utility

import os
 
#
# VARIABLEN
#
DATADIR = "data"
FILENAME = "messwerte.txt"
 
 
#
# FUNKTIONEN
#
 
 
def get_file():
    base_dir = os.path.dirname(os.path.dirname(__file__))
    data_dir = os.path.join(base_dir, DATADIR)
    os.makedirs(data_dir, exist_ok=True)
    return os.path.join(data_dir, FILENAME)
 
def show_help():
    print("\n======================  ANLEITUNG  ======================")
    print("(1) Wähle 'm', um eine Messung zu starten.")
    print("(2) Drücke 'ENTER', um die Messung zu beginnen.")
    print("(3) Warte, bis die Meldung 'JETZT!' erscheint.")
    print("(4) Drücke dann sofort 'ENTER', um die Messung zu stoppen.")
    print("")
    print("Weitere Befehle:")
    print("s  - Statistik anzeigen")
    print("r  - Messwerte zurücksetzen")
    print("h  - Diese Anleitung anzeigen")
    print("x  - Programm beenden")
    print("=========================================================")
 
 
def show_menu():
    print("\n---------------------------------------------------------")
    print("m - Messen")
    print("s - Statistik anzeigen")
    print("r - Reset")
    print("h - Hilfe")
    print("x - Beenden")
    print("---------------------------------------------------------")

Hauptprogramm

#!/usr/bin/env python3
 
from core.logic import *
from core.utility import *
 
VERSION = "This is reflexio-advanced v1.0"
 
 
def main():
    print(VERSION)
 
    file_path = get_file()
 
    while True:
        show_menu()
        choice = input("Eingabe: ").strip().lower()
 
        if choice == "m":
            reaction_time = start_measurement()
            print("Status: Messung beendet")
            print(f"Reaktionszeit: {reaction_time:.3f} Sekunden")
 
            save_value(file_path, reaction_time)
            values = load_values(file_path)
 
            avg = calculate_average(values)
            print(f"Anzahl Messwerte: {len(values)}")
            print(f"Durchschnitt: {avg:.3f} Sekunden")
 
        elif choice == "s":
            values = load_values(file_path)
 
            print()
            if not values:
                print("Es sind noch keine Messwerte vorhanden.")
            else:
                avg = calculate_average(values)
                print(f"Anzahl Messwerte: {len(values)}")
                print(f"Durchschnitt: {avg:.3f} Sekunden")
 
        elif choice == "r":
            print()
            if reset_data(file_path):
                print("Alle Messwerte wurden gelöscht.")
            else:
                print("Es sind keine gespeicherten Messwerte vorhanden.")
 
        elif choice == "h":
            show_help()
 
        elif choice == "x":
            print()
            print("Programm beendet.")
            break
 
        else:
            print("Ungültige Eingabe. Mit 'h' Hilfe anzeigen.")
 
 
if __name__ == "__main__":
    main()
projekt/python_erste_skripte.1771171359.txt.gz · Zuletzt geändert: von torsten.roehl