Versuch einer main() Funktion - Basename Error

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich wollte nur kurz Bescheid geben, dass ich mich heute Abend mit Beispielen zurück melde.


    Bis dahin, ich habe oben Sachen geschrieben wie:

    Zeile 14:'text' benötigt keine Klammern. Mit 'strftime' erstellst du schon einen String, das 'str' davor ist nicht notwendig

    schaue dir doch so Sachen nochmals an und vergleiche das mit deinem jetzigen Code.

    Du kannst dir auch mal Schritt für Schritt anschauen, wie du die Abfrage nach der richtigen Eingabe gemacht hast und wie das bei mir abläuft.

    Bis heute Abend,

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • schaue dir doch so Sachen nochmals an und vergleiche das mit deinem jetzigen Code.

    Du kannst dir auch mal Schritt für Schritt anschauen, wie du die Abfrage nach der richtigen Eingabe gemacht hast und wie das bei mir abläuft.

    Das mit Zeile 14 und den doppelten Klammern war mir auch noch aufgefallen und ich hatte sie entfernt. Hat sich mit deiner Antwort überschnitten.

    Ich hab jetzt lang getüftelt und auch die Ausnahmeregelungen geschafft.

    Das mit der zeitwert.minute funktioniert so leider nicht, da er dann nur die Minute nimmt und die Stunde außer acht lässt. Soll heißen bei einer angenommenen Weckzeit von 08:30 weckt auch um 09:30, um 10:30, ... , was nicht so optimal ist. :sleepy: Ich hab es aber dann trotzdem mit strftime() auf Minuten formatiert (Was die Wartezeit beim testen enorm verkürzte).

    Hab (ich hoffe mal) alle Varianten von Falscheingaben probiert und es klappt soweit. Sie werden alle abgefangen und kommentiert, bis hin zum Userabruch durch STRG+C, da werden dann sogar die Weckzeiten in der weckzeit.txt wieder gelöscht.

    Hier jetzt also mein überarbeiteter Code der diesmal hoffentlich weniger Kritikpunkte aufzuweisen hat.

    vg

    Thorsten

  • Hallo,

    Das hab ich noch nicht verstanden. Wie es gemacht wird, was die Rückgaben bedeuten und was ich damit anfangen kann

    Wir haben ja jetzt schon öfters try/except benutzt. Im 'try'-Block steht Code der ausgeführt werden soll, wenn dieser nicht erfolgreich ausgeführt wird, dann wird das Programm nicht beendet, sondern es wird der 'except'-Block ausgeführt.

    Wenn du 'run' ohne 'check=True' verwendest, dann gibt 'run' immer die Meldung zurück, dass der Code erfolgreich war. Auch wenn er das gar nicht war. Das ist natürlich nicht erwünscht, da das "Ergebnis" von 'run' das Verhalten des Codes beeinflussen kann.

    Führe mal folgende Codes aus und achte darauf wann 'Jetzt wird eine Ausnahme ausgelöst' in deiner Konsole erscheint. Als Hinweis, ich habe keinen Ordner Namens "PipiLangstrumpf" in meinem home-Verzeichnis.

    Ausgabe:

    Code
    >>> %Run test.py
    ls: Zugriff auf '/home/Pipi' nicht möglich: Datei oder Verzeichnis nicht gefunden

    Code:

    Ausgabe:

    Code
    ls: Zugriff auf '/home/PipiLangstrumpf' nicht möglich: Datei oder Verzeichnis nicht gefunden
    Jetzt wird die Ausnahme ausgelöst

    Du siehst, erst durch 'check=True' wird Python gemeldet, dass mit dem 'run'-Befehl etwas nicht stimmt und erst jetzt kann man im Programm darauf reagieren. Anders würde das Programm durch laufen, als sei der 'run'-Befehl erfolgreich ausgeführt worden. (Also je nach dem was da so gemacht wird).

    Dein neuer Code: Du musst bei 'SNIPER' nicht einen Pfad erstellst und in der gleichen Zeile dann noch ein String daraus machen. Wie du an meinen PipiLangstrumpf-Beispielen siehst, funktioniert subprocess mit Path-Objekten. run([SNIPER], check=True)

    Wenn du aus der Dauerschleife ausbrechen willst ist die gängige Methode 'break' anstatt 'exit()' zu verwenden. Wenn du im 'else'-Zweig 'True' zurück gibst, benötigst du kein 'break' mehr, die Dauerschleife wird auch verlassen.

    Wenn du eine Konstante definieren willst, dann nicht in einer Funktion sondern auf Modulebene wie die anderen auch.

    'weckzeit_in_log_schreiben' ist etwas überflüßig oder? Du rufst die Funktion auf und in der Funktion rufst du eigentlich nur eine andere Funktion auf, die dann in die Datei schreibt. Dann könntest du die 'log_schreiben' gleich direkt aufzurufen. 'weckzeit_in_log_schreiben' auch das Argument 'weckzeit', dass gar nicht benutzt wird.

    Da du in der 'main' den ersten 'logtext' eh an einen manuell erstellten String bindest, könntest du auf den 'logtext' verzichten und den String direkt an die Funktion 'check_args_auf_loeschen' übergeben. Siehe Beispiele von gestern.

    Wenn du den Code noch kürzen willst, kannst du dich noch mal mit try/ecxept beschäftigen, ich persönlich finde die Variante um die Eingabe zu prüfen etwas übersichtlicher und es spart Codezeilen. Hatte ich ja in der 'main'-Funktion so gemacht:

    Es hat aber bestimmt auch etwas mit persönlichem Geschmack zu tun. Ich bin selbst kein Programmierer, aber soweit ich das gelernt habe, sind die besten Codezeilen die, die man nicht unbedingt benötigt.

    Grüße und viel Spass

    Dennis

    P.S wenn ich mich unklar ausgedrückt habe, einfach sagen.

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Du siehst, erst durch 'check=True' wird Python gemeldet, dass mit dem 'run'-Befehl etwas nicht stimmt und erst jetzt kann man im Programm darauf reagieren. Anders würde das Programm durch laufen, als sei der 'run'-Befehl erfolgreich ausgeführt worden. (Also je nach dem was da so gemacht wird).

    Guten Abend, so wird da ein Schuh draus. In deinem Beispielcode aus dem anderen Beitrag stand dieser Ausschnitt;

    Code
    def check_input():
        if argv[1] == '99':
            print('gelöscht')
        else:
            return True
    
    
    def main():
        if check_input():

    und schreibst weiter unten:

    Zitat


    Um den Erfolg des Befehls zu registrieren, dazu ist auch das 'check=True' da. Funktioniert etwas nicht, dann wird eine Ausnahmebehandlung ausgeführt und man kann entsprechend reagieren.

    im Code steht das mit dem "check-True" so nicht drin. Und dann beginnt deine main() mit if check_input():. Das hab ich nicht verstanden und mir zusammengereimt "Wenn Check_input ein True zurückgibt, dann.. :". Aber eine Ausgabe hab ich nicht bemerkt. Jetzt mit deinem Beispielen mit und ohne ergibt das mehr Sinn. Hab ich verstanden, ich denke aber, ich werde es hier aber nicht einsetzen. Auch aus Gründen im nächsten Absatz.

    Dann meintest du das mit dem String vor dem Path ist unnötig. Muss ich widersprechen, im Code gleich mehr. Ich hab Path zuerst ohne str und beim zweiten mal mit ausgeführt. Was man bei der 2. Ausführung auch schön sehen kann: Ich bekomme eine Meldung von Sniper, dass er erfolgreich war und auch vom System, dass der Prozess terminiert wurde. Das reicht mir dann an Meldungen, zumal ich sie im Hauptbedienelement, der Webseite, sowieso nicht zu sehen bekomme.

    Anscheinend hat subprocess Probleme mit pathlib.Path. Man findet mehrere Beiträge im Netz dazu. Die Lösung mit dem String hab ich dann hier gefunden.

    Bei der Funktion "plausi_check()" bin ich auch noch nicht am Ende, aber doch erst mal happy, dass sie tatsächlich funktioniert. Das verfeinern, vereinfachen bis hin zum komplett umschreiben kommt garantiert.

    P.S wenn ich mich unklar ausgedrückt habe, einfach sagen.

    Nö, nur manchmal ist die Materie an sich "unklar". Mir zumindest. Da brauch ich dann noch Schubser aus anderen Richtungen zu gleichen Thema, dann fällt ja meist der Groschen. Und ich lerne ständig dazu. Python ist meine erste "Hochsprache" in die ich tatsächlich reinkomme. Ich habs mal mit C/C++ versucht, da kam ich aber irgendwie gleich am Anfang schon nicht weiter. Und mit "Atari-Basic" aus den 80ern kommt man ja heute auch nicht mehr weiter :lol:

    Dann sag ich dir - und natürlich auch allen anderen Beteiligten hier im Thread - mal Dankeschön für diese ganze Arbeit mit mir! :danke_ATDE:

    Bis zum nächsten Problem

    Viele Grüße

    Thorsten

  • Guten Morgen,

    Anscheinend hat subprocess Probleme mit pathlib.Path

    Auch wenn du das so angibst, wie ich es vorgeschlagen habe?

    subprocess mit Path-Objekten. run([SNIPER], check=True)

    Achte auf die eckige Klammer, dazu findet man auch etwas in der Dokumentation.

    Wenn du aus dem Path-Objekt einen String machst, dann verlierst du die Vorteile des Path-Objekts (ist für dein Programm zwar nicht wichtig), aber man kann ja gleich an zukünftige Projekte denken.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Auch wenn du das so angibst, wie ich es vorgeschlagen habe?

    Auch guten Morgen,

    ja, so klappt es. aus den Docs lese ich aber eher, dass man das macht wenn mehrere Element zusammengefasst werden. Mein Pfad sieht aber nicht nach mehreren Elementen aus, keine Leerzeichen, keine Kommas. Der Punkt vor der Dateiendung kann es auch nicht sein, bei *txt geht es ja problemlos ohne eckige Klammern. Aber nach dem was ich gelesen habe, was das alles kann, bin ich ja mal gespannt ob ich je auf den Stand kommen werde es auch zu brauchen :lol:

    Ich würde einfach Mal das schedule-Module einwerfen.

    Der Einwurf ist klasse! Hättest du den nicht bereits vor einer Woche machen können? :)

    Und gleich auch gelernt, das schedule mit sch am Anfang geschrieben wird. Das werd' ich in der nächsten Version bestimmt einbauen.

    Ich hab jetzt nichts dazu gefunden, aber geht damit auch so was wie "schedule.von-mai-bis-august"?

    Thorsten

  • 'weckzeit_in_log_schreiben' auch das Argument 'weckzeit', dass gar nicht benutzt wird.

    Kam mir auch komisch vor, aber es wird tatsächlich benötigt, da "weckzeit" im "logtext" verwendet wird.

    Wenn du aus der Dauerschleife ausbrechen willst ist die gängige Methode 'break' anstatt 'exit()' zu verwenden. Wenn du im 'else'-Zweig 'True' zurück gibst, benötigst du kein 'break' mehr, die Dauerschleife wird auch verlassen.

    Auch die exits sind so richtig, ich möchte dort ja nicht einfach nur aus der Schleife raus, sondern wirklich das Programm an dieser Stelle komplett verlassen. Habs mit break versucht. Das hat, soweit ich das überblicke zur Folge, dass ich zwar aus der Schleife raus bin aber das Programm versucht mit den fehlerhaften Werten weiter zu machen, was dann wieder Fehlermeldungen nach sich zieht. In der Funktion plausi_check(). und auch in der Funktion check_args_auf_loeschen() macht es ja keinen Sinn, wenn das Programm weitermacht, mit was auch?

    plausi_check() konnte ich mittlerweile dank range() um einiges kürzen:

    Ja, auch die Printzeilen könnte man in einer zusammenführen, ich hasse es aber horizontal scrollen zu müssen :daumendreh2:

    Einmal editiert, zuletzt von tdl (12. August 2021 um 11:25)

  • Kam mir auch komisch vor, aber es wird tatsächlich benötigt, da "weckzeit" im "logtext" verwendet wird.

    Das heißt, wenn du deine Funktion und den Funktionsaufruf so abänderst :

    Code
    def weckzeit_in_log_schreiben(logtext):
        log_schreiben(logtext)
        print (logtext)
    
    
    def main():
        weckzeit = time(int(argv[1]), int(argv[2]))
        logtext = (f"Weckzeit um: {weckzeit.strftime('%H:%M')} Uhr")
        weckzeit_in_log_schreiben(logtext)

    dann geht es nicht? Das würde mich schwer wundern oder wir haben aneinander vorbei geredet.

    Zum Vergleich nochmal dein Original, damit du weist was ich gemeint habe:

    Code
    def weckzeit_in_log_schreiben(weckzeit, logtext):
        log_schreiben(logtext)
        print (logtext)
    
    
    def main():
        weckzeit = time(int(argv[1]), int(argv[2]))
        logtext = (f"Weckzeit um: {weckzeit.strftime('%H:%M')} Uhr")
        weckzeit_in_log_schreiben(weckzeit, logtext)

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • dann geht es nicht? Das würde mich schwer wundern oder wir haben aneinander vorbei geredet.


    Zum Vergleich nochmal dein Original, damit du weist was ich gemeint habe:

    Nein, haben wir nicht, ich hab schlampig getestet. Ich hatte es nur aus der Funktion unten entfernt. Ok, funktioniert auch ohne, wenn ich es aus beiden Funktionen rausnehme.

  • Ja, auch die Printzeilen könnte man in einer zusammenführen, ich hasse es aber horizontal scrollen zu müssen

    Das kann man anders regeln als mehrfach die Funktion print() aufzurufen. ;)

    Z.B. so:

    Code
    print(f"{FEHLER}\nWert für Stunden :   0-23" \
           "Wert für Minute  :   0-59" \
           "\nWecker ausstellen: ./wecken.py 99\n")

    Mann könnte der Übersicht wegen auch nach der öffnenden und vor der schließenden runden Klammer in eine neue Zeile gehen.

  • Das kann man anders regeln als mehrfach die Funktion print() aufzurufen. ;)


    Z.B. so:
    Code print(f"{FEHLER}\nWert für Stunden : 0-23" \ "Wert für Minute : 0-59" \ "\nWecker ausstellen: ./wecken.py 99\n")

    Mann könnte der Übersicht wegen auch nach der öffnenden und vor der schließenden runden Klammer in eine neue Zeile gehen.

    Das ist praktisch. Danke. Ich hab da grad mal mit rumgespielt, man bräuchte dann auch nicht mehr entsprechend einrücken. Aber dann wird unübersichtlich.

  • Ich hab jetzt nichts dazu gefunden, aber geht damit auch so was wie "schedule.von-mai-bis-august"?

    Dazu gabs im Github-Forum schon eine Diskussion und das wird es nicht geben.

    Entweder du schaust nach einer alternativen Bibliothek oder du nutzt eine Systemd Timer Unit.

    Kommt dann auch darauf an was du damit machen willst.

    Soll ein Script von-bis laufen oder nur einmal im Monat oder oder....?


    Aber dazu solltest du einen neuen Thread aufmachen.

  • Dennis89 `datetime.now()` sollte man nur einmal Aufrufen wenn man verschiedene Bestandteile vom *gleichen* Zeitpunkt vergleichen will. Denn wenn Du das mehrfach aufrufst, dann sind es ja mehrere Zeitpunkte von denen Bestandteile verglichen werden. Da muss man dann extra aufpassen ob es da nicht Fälle geben kann in denen die Zeitpunkte so weit auseinander liegen, dass es Probleme geben kann.

    *In* einer f-Zeichenkette braucht man kein `strftime()` aufrufen, da kann man die Formatierung direkt über die Platzhaltersyntax regeln:

    Python
        logtext = f"Weckzeit um: {weckzeit.strftime('%H:%M')} Uhr"
    
        # =>
    
        logtext = f"Weckzeit um: {weckzeit:%H:%M} Uhr"

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • *In* einer f-Zeichenkette braucht man kein `strftime()` aufrufen, da kann man die Formatierung direkt über die Platzhaltersyntax regeln:

    Danke für den Hinweis, habs direkt umgeschrieben.

  • Man sieht am Funktionsnamen `args_checken_loeschen_plausi()` eigentlich schon das diese Funktion zu viel macht. Eine Funktion die Argumente überprüft sollte nichts löschen. Und die sollte als Ergebnis einen Wahrheitswert liefern und nicht das ganze Programm beenden. Wie schon gesagt sollte man mit `exit()` sparsam umgehen, und ausserhalb der `main()`-Funktion hat das eigentlich nichts zu suchen. Und dort auch nur wenn da zumindest potentiell ein anderer Code als 0 an den Aufrufer zurückgegeben wird. Ansonsten riecht das sehr nach einem schnellen Ausweg, weil man sich keine Gedanken um den normalen Programmablauf machen wollte.

    Die ``while``-Schleife macht keinen Sinn, weil die *immer* mindestens einmal durchlaufen wird und *immer* ersten Durchlauf abgebrochen wird. Damit ist das keine Schleife.

    Ein ``x in range(a, b)``-Test ist ungewöhnlich bis falsch. Da muss man hoffen, dass der Wertebereich recht klein ist, oder das `range`-Objekte diesen Test optimiert implementiert haben. Da würde man verkettete Vergleiche schreiben, wie man das aus der Mathematik kennt: ``a <= x < b``. Ist auch ein bisschen weniger zu tippen.

    `log_schreiben()` geht kürzer — `Path`-Objekte haben da eine passende Methode.

    Was macht das Sniper-Skript eigentlich? Doch nicht etwa *dieses* Programm abschiessen‽ Das könnte sich ja einfach selbst beenden.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Man sieht am Funktionsnamen `args_checken_loeschen_plausi()` eigentlich schon das diese Funktion zu viel macht.

    Über Namensgebung lässt sich streiten, man könnte sie auch einfach "eingaben_pruefen()" nennen. Ob sie zu viel macht? In einer früheren Version sah es so aus (Beitrag #22). Da ist nicht mehr viel von der "plausi_check()" übriggeblieben. Und da beide Funktionen letzlich die Argumente überprüfen, was lag da näher, als sie zusammenzulegen. Die Reihenfolge ist zwingend. Die "exits" sind notwendig und Bestandteil des korrekten Programmablaufs (Beitrag #28).

    Die ``while``-Schleife macht keinen Sinn, weil die *immer* mindestens einmal durchlaufen wird und *immer* ersten Durchlauf abgebrochen wird. Damit ist das keine Schleife.

    Ich gehe mal davon aus, dass du mit "die 'while'_Schleife die erste von beiden meinst. Hab ich eben probiert stimmt, die ist jetzt weg. Danke.

    Ein ``x in range(a, b)``-Test ist ungewöhnlich bis falsch. Da muss man hoffen, dass der Wertebereich recht klein ist,

    Ungewöhnlich kann ich nicht beurteilen, aber für falsch funktioniert es einfach zu gut ;) . Auch muss man da nichts hoffen, der Wertebereich ist doch klar definiert und steht im Code. Ehrlich gesagt finde ich das sogar eleganter als mit kleiner, größer, gleich Abfrage.

    `log_schreiben()` geht kürzer — `Path`-Objekte haben da eine passende Methode.

    Wenn du auf Path.open() anspielst, dann ist es tatsächlich kürzer. Um ein Zeichen. Falls du was anderes gemeint hast: Entschuldige bitte meinen Sarkasmus :)

    Code
    def log_schreiben(logtext):
        with LOG_DATEI.open("w", encoding="ascii") as datei:
        with open(LOG_DATEI, "w", encoding="ascii") as datei:
            datei.write(logtext)

    Was macht das Sniper-Skript eigentlich? Doch nicht etwa *dieses* Programm abschiessen‽ Das könnte sich ja einfach selbst beenden.

    Mit Verweis auf Beitrag #17. Doch genau das macht sniper. Wie im echten Leben. Peng und weg! Wie beendest du denn einen Prozess? In der Regel wird der Wecker ja auch nicht in der Konsole gestartet sondern über ein Webinterface gestellt und wieder ausgeschaltet. da läuft eine Instanz des Programms in einer Endlosschleife im Hintergrund. Wie soll ich der denn sonst sagen dass sie sich beenden soll?

    Danke für deine Anregungen. Aber das Programm läuft fehlerfrei und macht genau das was es machen soll.

  • tdl Der Funktionsame ist ja quasi richtig aber der sollte halt nicht sein, weil der Inhalt der Funktion nicht so sein sollte. Funktionen sollten möglichst einen Job erledigen und einzeln testbar sein.

    Die `exit()`-Aufrufe sind da falsch. Das sollte nicht in so einer Funktion geschehen. Die sollte die Argumente prüfen und `True` oder `False` liefern, oder eventuell auch die Argumente validiert und konvertiert liefern oder eine Ausnahme auslösen wenn was mit den Argumenten nicht stimmt. Das Programm im Fehlerfall abbrechen kann man dann im Hauptprogramm machen, wo es hingehört.

    Das mit dem `range()` würde ich jetzt auch wirklich als falsch bezeichnen. Das würde IMHO durch keinen Code-Review kommen. Es ist nicht garantiert, dass `range`-Objekte eine effiziente `__contains__()`-Methode implementieren, was dazu führen würde, dass da eine Schleife läuft, die alle Zahlen von 0 bis 23 bzw. 0 bis 59 durchgehet und jede einzelne prüft bis entweder die Zahl gefunden ist, oder alle durchlaufen wurden. Statt offensichtlich einfach nur zwei Vergleiche zu machen. Das CPython's `range`-Objekte wahrscheinlich effizienter sind, ist ein Implementierungsdetail auf das man sich IMHO nicht verlassen sollte.

    Nö, ich meinte nicht `Path.open()`. Es gibt Methoden die das öffnen, schreiben, und schliessen erledigen. Eine für Text und eine für Binärdaten.

    Statt Shell-Skript würde ich das beenden in Python erledigen. Entweder über eine Datei in die die PID geschrieben wird, oder per `psutil`-Modul den Weg vom Sniper nachprogrammieren.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Der Funktionsame ist ja quasi richtig aber der sollte halt nicht sein, weil der Inhalt der Funktion nicht so sein sollte. Funktionen sollten möglichst einen Job erledigen und einzeln testbar sein.

    Die Funktion hat die Aufgabe die übergebenen Argumente zu prüfen. Was aber bringt eine Prüfung wenn nicht auf das Prüfergebnis reagiert wird je nachdem wie es ausfällt? Die Funktion hat also bereits an dieser Stelle zwei Jobs: Prüfen und Reagieren.

    Jetzt gibt es verschiedene Möglichkeiten der Eingabe und auch der Falscheingabe. Deshalb wird die Prüfung aufgeteilt. Hier durch die If Abfrage.

    Als erstes wird geprüft ob das 1. Argument vielleicht genau eine "99" ist. 99 Ist die vorgesehene Eingabe um den Wecker auszustellen, die Weckzeit zu löschen. Was dann auch geschieht. Danach wird das Programm beendet. Wie ich weiter oben schon schrieb, gibt es ja in diesem Fall auch keinen Grund für das Programm weiter zu laufen. Prüfung >> direkte Reaktion auf Ergebnis der Prüfung.

    Als nächstes kommt das elif. Hier wird geprüft ob Argument 1 + 2 im jeweils richtigen Bereich liegen. Tun sie das nicht, Wird der entsprechende Hinweis gegeben wie die Eingabe zu erfolgen hat und in welchen Bereichen sich die Eingaben befinden müssen.

    Haben die Argumente diese Prüfungen überstanden gehts weiter im Programm. Aber halt. was wenn jemand gar nichts eingibt oder es gar mit Buchstaben versucht? Dan greifen die Ausnahmeregelungen aus dem except. Weisen darauf hin, dass nur Ziffern akzeptiert werden und beendet das Programm.

    Natürlich kann man daraus 2 Funktionen machen. Man kann auch die Stunden und Minuten in einer jeweils getrennten Funktion überprüfen. Und dann kommt der nächste und sagt, dass man das aber auch alles in einer Funktion zusammenfassen kann. Viele Wege führen zum Ziel. Ob nun Weg a oder Weg b der "bessere" oder "schönere" ist sei da mal dahin gestellt.

    Das erste exit() konnte übrigens tatsächlich weg, die beiden anderen müssen aber bleiben. Die haben einen Sinn. Sie unterdrücken die Fehlermeldungen des Systems und geben ausschließlich den von mir für den jeweiligen Fall vorgesehenen Text aus.

    Beim Range verstehe ich was du meinst, aber da wir hier nicht von Listen mit 1,8 Millionen Einträgen reden sonder 24 bzw 60 sind diese Bedenken m. E. vernachlässigbar. Auch hier: Änder ich es (wieder zurück, das hatte ich ja schon mal) kommt der nächste und meint "Ich mach das aber anders..." Zusätzlich werden die Eingaben auch noch auf der Webseite auf Richtigkeit geprüft, <input type="number">

    Zu der Sache mit dem Path hast du jetzt zwei mal vage Andeutungen gemacht, dann mach aber auch mal "Butter bei die Fische".

    Thema Sniper: Ich glaube dem Programm ist es egal ob es jetzt von einem Python Script oder einem professionellen Bashkiller abgeschossen wird.

    Das Bashscript "sniper" habe ich auch für andere Sachen im Einsatz. Es hat sich bewährt und ist doch völlig ausreichend. Nur des guten Geschmacks wegen werd ich da jetzt nichts neues schreiben.

    Eine gute Nacht, ich mach jetzt Schluss

    Thorsten

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!