1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
| #!/bin/env python
# Wir beginnen mit dem shebang. Dieser definiert, mit welchem Interpreter das Script ausgeführt werden soll.
# Damit unser Script möglichst auf allen Systemen lauffähig wird, verwenden wir /bin/env und nicht einen hart kodierten Pfad zum Interpreter
""" Dies ist der Module Docstring. Darin beschreiben wir, was unser Script tut """
# nun folgen die imports von weiteren Modulen, welche wir in unserem Script verwenden wollen
import time
import sys
import signal
import getopt
import os
from pathlib import Path
# Nun definieren wir eine Funktion, damit beim beenden des Scripts die temporäre Datei gelöscht und ein entsprechender Text zurückgegeben wird
def cleanup(_signo=None, _stack_frame=None):
""" Das ist ein function Docstring
Diese Funktion räumt die temporäre Datei weg und gibt einen kurzen Text aus"""
print("entferne die temporäre Datei")
# mit einem try/except Block fangen wir mögliche Fehler ab
try:
os.remove(TMP_FILE)
except FileNotFoundError:
print("temporäre Datei konnte nicht gelöscht werden: Datei existiert nicht")
except PermissionError:
print("temporäre Datei konnte nicht gelöscht werden: Zugriff verweigert")
except:
print("temporäre Datei konnte nicht gelöscht werden: ein unbekannter Fehler ist aufgetreten")
print("Script wird beendet")
sys.exit(0)
# nun definieren wir eine Funktion, welche die Variable MY_VAR in die temporäre Datei schreibt und zusätzlich die Anzahl Durchläufe auf die Konsole ausgibt.
# Wie oft definieren wir mit einem Argument iterations
def print_variable(iterations):
""" Diese Funktion schreibt den Wert der Variable MY_VAR in eine temporäre Datei """
# Um die Variable auszugeben, verwenden wir einen for loop
for index in range(iterations):
print(f"wir befinden uns in der {index}. Wiederholung einer for Schleife")
with open(TMP_FILE, "a", encoding="utf-8") as file:
file.write(f"{MY_VAR}\n")
print(MY_VAR)
def parse_args():
""" Diese Funktion parsed die Argumente """
# als nächstes parsen wir die Parameter, welche unsere Script übergeben wurden
# wir erlauben ein einziges Argument `-n` (number)
number = None # default Wert des number Arguments
argv = sys.argv[1:]
try:
opts, _args = getopt.getopt(argv, "n:")
for opt, arg in opts:
if opt in ['-n']:
number = int(arg)
except getopt.GetoptError as error:
print(error)
cleanup()
return number
def startup():
""" In dieser Funktion bereiten wir den Start unseres Scripts vor """
# Damit unsere cleanup Funktion beim beenden auch ausgeführt wird, müssen wir diese mit den gewünschten Signalen "verbinden"
for sig in [signal.SIGTERM, signal.SIGINT]:
signal.signal(sig, cleanup)
# temporäre Datei erstellen
Path(TMP_FILE).touch()
def main():
""" Das ist die Hauptfunktion unsers Scripts. Sie wird beim start ausgeführt"""
# Funktionsaufruf ohne Argumente, der return Wert wird der Variable number zugewiesen
# Diese Variable ist lokal, da sie innerhalb einer Funktion definiert wird
# Wir können in anderen Funktionen daher nicht auf diese Variable zugreifen, sondern
# müssen diese als Argument der Funktion übergeben
number = parse_args()
# Funktionsaufruf ohne Argumente
startup()
# Wir prüfen zuerst, ob die Variable number definiert ist
if number is not None:
# Wenn die Variable definiert ist prüfen wir, ob die Zahl grösser oder kleiner als 10 ist
if number < 10:
print_variable(number) # Funktionsaufruf mit Argument
else:
print("die nummer ist 10 oder grösser")
# Nun fragen wir den User nach einer Zahl
wait_time = input("Gib eine Zahl ein: ")
if not wait_time:
print("Du hast nichts eingegeben")
else:
time.sleep(int(wait_time))
cleanup()
if __name__ == "__main__":
# Definition von Variablen
# Diese Variablen sind global, da sie nicht innerhalb einer Funktion definiert sind
# achte darauf, dass du dich im gesamten Script an eine einheitliche Syntax (camelCase oder snake_case) hältst
MY_VAR = "example"
TMP_FILE = "/tmp/tmpfile"
main()
|