Python, Programm nochmals ausführen?

OP #7752795
Lesenswert?

Hallo, ich beschäftige mich seit ein paar Tagen mit Python und wollte mal fragen welche Möglichkeiten es gibt das Programm welches am Ende angekommen ist nochmal auszuführen. Es findet also eine Abfrage statt möchten Sie einen weiteren Test durchführen (j/n).....

Müsste man das ganze Programm in eine While Schleife einrücken oder gibt es eine andere Möglichkeit so wie ein jmp oder goto....

#7752995
Lesenswert?

Thomas schrieb:

Müsste man das ganze Programm in eine While Schleife einrücken oder gibt es eine andere Möglichkeit so wie ein jmp oder goto....

Eine Schleife wäre eine Möglichkeit. Eine andere wären die Methoden der exec*-Familie aus dem Standardmodul os. Mit diesen Methoden wird das Betriebssystem angewiesen, den aktuell laufenden Prozeß durch einen frisch neu gestarteten zu ersetzen, der exec*() als Parameter spezifiziert wird. Das kann natürlich auch das aktuell bereits laufende Programm sein.

#7753124
Lesenswert?

G. K. schrieb:

Thomas schrieb:

Müsste man das ganze Programm in eine While Schleife einrücken oder gibt es eine andere Möglichkeit so wie ein jmp oder goto....

Tipp: Mit vi kann man beliebig viele Zeile auf einmal einen weiter einrücken. 1,$ >>

Der ist schon ganz gut, wenn auch etwas ›Hau drauf‹ ;-)

Oder zur ersten einzurückenden Zeile gehen, dann: mx Zur letzten einzurückenden Zeile gehen,dann:

'x

Im Grunde genommen ist so ein vi schon ein recht intuitiv zu benutzender Editor.

OP #7753452
Lesenswert?

also danke nach mal für die weiteren Möglichkeiten.

Da das ganze eh wegen des langen Pfades des Netzlaufwerkes per Batch-Datei aufgerufen wird, werde ich das ganze old school in die Batch integrieren und das beendete Programm dann einfach nochmals aufrufen.

1
start:
2
python.exe ..... .py
3

4
choice /m "Weiteren Test starten?" #erzeugt eine J/N Abfrage
5
if errorlevel 1 goto start
#7753908
Lesenswert?

Ein Gutes Python Programm sollte sowieso immer eine main Funktion haben, nicht weil sie Gebraucht wird, sondern weil es best pratice ist und ermöglicht, dass du dein Programm schnell mal zu einem Modul aufwerten kannst. Außerdem hat das Verwenden einer Main Funktion den Vorteil, das man dafür Unittest schreiben kann, wenn man es will.

Daher kann die Abfrage durchaus in der Main sein. Die Funktion do_work ist ein Platzhalter für deinen Code.

1
def do_work():
2
    # Dein Python Script
3
    pass
4

5
def main():
6
    while True:
7
        do_work()
8
        run_again = input("soll das Programm nochmal laufen (J/N): ")
9
        if not run_again.lower() == "j":
10
            break
11

12

13
if __name__ == "__main__":
14
    main()
#7754618
Lesenswert?

Norbert schrieb:

Der ist schon ganz gut, wenn auch etwas ›Hau drauf‹ ;-)

Oder zur ersten einzurückenden Zeile gehen, dann: mx Zur letzten einzurückenden Zeile gehen,dann:

'x

Im Grunde genommen ist so ein vi schon ein recht intuitiv zu benutzender Editor.

Ja, schon. In allen anderen Editoren die ich nutze muss ich immer umständlich die TAB-Taste drücken. Das kann sich doch keiner merken! Ich muss das auch jedesmal wieder googeln.

#7754628
Lesenswert?

Le X. schrieb:

Ja, schon. In allen anderen Editoren die ich nutze muss ich immer umständlich die TAB-Taste drücken. Das kann sich doch keiner merken! Ich muss das auch jedesmal wieder googeln.

Ich sehe und verstehe dein Leid. ;-)

Deshalb mag ich auch die einfache Sequenz: mx … >'x Zumal man das ›x‹ durch 25 andere Buchstaben ersetzen und so 26 individuelle Blöcke definieren kann. Mag gar nicht darüber nachdenken, wie schwierig es heutzutage ist, eine Tastatur mit 26 unterschiedlichen TAB-Tasten zu finden. Ein Teufelskreis…

OP #7754925
Lesenswert?

also in der batch Datei muss es so heißen

1
if %errorlevel%==1

sonst springt er nie aus der Schleife raus.

Habs, jetzt aber doch in Python mit einer while Schleife gemacht, falls es mal auf einem nicht Microsoft System ausgeführt wird, dann ist es zumindestens im Programm integriert.

Alles markieren und Tab rückt es passend ein.

#7758195
Lesenswert?

Harald K. schrieb:

Nun, kennt Python so etwas wie "goto"? Wenn nicht, warum nicht?

https://www.python-forum.de/viewtopic.php?t=52193

Goto wirst du in modernen Programmiersprachen gar nicht mehr finden. Es ist eine Ausgeburt der Hölle, die Grundzutat für Spaghetti-Code. Wir wurde schon in der Schule beigebracht, dass man es nicht verwenden soll, denn ich hatte es in Pascal verwendet. Ich hatte zuvor viel mit Basic gemacht und diesen schlechten Programmierspiel rübergenommen.

Oliver hat dir schon das richtige Muster genannt.

Moderator #7758201
Lesenswert?

Rudi R. schrieb:

Goto wirst du in modernen Programmiersprachen gar nicht mehr finden.

Python wäre aber nicht Python, wenn man goto nicht nachrüsten könnte:

http://entrian.com/goto/download.html

Es ist eine Ausgeburt der Hölle, die Grundzutat für Spaghetti-Code. Wir wurde schon in der Schule beigebracht, dass man es nicht verwenden soll

Dann nimm statt goto einfach comefrom. Das wird vom verlinkten Paket ebenfalls unterstützt.

Alternativ zu while, goto und comefrom kann man Rückwärtssprünge bzw. Schleifen auch mittels Rekursion realisieren. Leider führt dies in Python normalerweise schnell zu Stacküberläufen.

Python wäre aber nicht Python, wenn es nicht auch dafür eine Lösung gäbe:

https://chrispenner.ca/posts/python-tail-recursion

#7759646
Lesenswert?

Yalu X. schrieb:

Python wäre aber nicht Python, wenn man goto nicht nachrüsten könnte:

http://entrian.com/goto/download.html

Das ist aber ein Aprilscherz. Guido van Rossum hatte sich aus gutem Grund gegen Goto entschieden und es wird auch nie kommen. Das scheinen vor allem Entwickler "aus der guten alten Zeit" zu vermissen. Ich frage mal morgen unsere Azubis, ob die wissen, was Sprungmarken sind.

Ich hatte mal ein Rüffel erhalten, weil 2008/9 eine Doppelschleife in Java programmierte.

1
OUTER:
2
for (Obj a in as) {
3
  for (Obj b in bs) {
4

5
     if (...) {
6
        break OUTER;
7
     }
8
  }
9
}

Das geht ja auch in Java. Es sieht aus wie eine Sprungmarke, ist aber eine Benamsung der Schleife, dass ich sie mit break oder continue referenzieren kann. break und continue alleine referenzieren die innerste Schleife.

Für den Chef waren das Sprungmarken, weil sie so aussahen, und deshalb böse.

Das mit der Tail-Rekursion werde ich mir bestimmt noch anschauen. Das Konzept ist ja bekannt. Bei meinen Ausflügen in Scala und Haskell hatte ich damit Berührung. Und sinnvoll ist allemal. Viele scheuen rekursive Aufrufe, obwohl viele Dinge rekursiv einfach viel eleganter ausschauen.

#7761151
Lesenswert?

Thomas schrieb:

Müsste man das ganze Programm in eine While Schleife einrücken oder gibt es eine andere Möglichkeit so wie ein jmp oder goto....

Man kann auch List Comprehensions in Python einsetzen.

Yalu X. schrieb:

Python wäre aber nicht Python, wenn es nicht auch dafür eine Lösung gäbe:

Ich musste so lachen.. Tatsächlich lernt man das mit den Schleifen (oder den Tests) nicht an einem Tag, TE sollte sich einfach selbst ein wenig mehr Zeit zum Lernen einräumen. Gute Schleifen sind auch Übung- und Probiersache (Diskutiersache auch gelegentlich) - und ein wenig Abguckerei bei guten Codern kann auch helfen.

edit: ist eigentlich gerade gut fürs Lernen, wenn man offene Fragen hat, sich die Antworten dann aber erstmal selbst erarbeitet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren