Forum: PC-Programmierung Python, Programm nochmals ausführen?


von Thomas (kosmos)


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....

von Mario M. (thelonging)


Lesenswert?

Ja, Wiederholung setzt Schleifen voraus.

von Harald K. (kirnbichler)


Lesenswert?

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

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

von Norbert (der_norbert)


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....
1
#!/python
2
def dein_programm():
3
    # …
4
    return
5
6
while True:
7
    dein_programm()

von Ein T. (ein_typ)


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.

von Norbert (der_norbert)


Lesenswert?

Ein T. schrieb:
> Eine andere wären die Methoden der
> exec*-Familie aus dem Standardmodul os.

Uhhhhh, das ist aber schon arg von hinten durch die Brust ins Auge 
geschossen. ;-)

Aber gut, hier noch einer:
Mittels systemd** einen sich beendenden Prozess endlos automatisch neu 
starten.

**oder ähnlichem Mechanismus

: Bearbeitet durch User
von G. K. (zumsel)


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....

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

von Norbert (der_norbert)


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.

von Frank O. (frank_o)


Lesenswert?

Thomas schrieb:
> 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).....

Die Frage am Ende, die setzt doch schon die Bedingung für eine Schleife.

von Thomas (kosmos)


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

: Bearbeitet durch User
von Oliver (imonbln)


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()

von Le X. (lex_91)


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.

von Norbert (der_norbert)


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…

von Thomas (kosmos)


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.

: Bearbeitet durch User
von Rudi R. (rudi_r)


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.

von Yalu X. (yalu) (Moderator)


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

von Norbert (der_norbert)


Lesenswert?

Man kann natürlich für jede extrem einfache Aufgabe über eine Unzahl an 
bewusst blödsinnigen Umwegen sinnieren.

Das heißt aber nicht automatisch, dass man es auch tun muss!

von Rudi R. (rudi_r)


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.

von Franko S. (frank_s866)


Lesenswert?

Rudi R. schrieb:
> ich damit Berührung. Und sinnvoll ist allemal. Viele scheuen rekursive
> Aufrufe, obwohl viele Dinge rekursiv einfach viel eleganter ausschauen.

Es geht nicht um aussehen, es geht um Optimierung.

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Franko S. schrieb:
> Es geht nicht um aussehen, es geht um Optimierung.

die allererste Optimierung ist die, wartbaren, lesbaren und verstehbaren 
Quelltext zu schreiben.

von Franko S. (frank_s866)


Lesenswert?

D. F. schrieb:
> die allererste Optimierung ist die, wartbaren, lesbaren und verstehbaren
> Quelltext zu schreiben.
[ ] Du hast den Hintergrund meiner Aussage verstanden.

von Rbx (rcx)


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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.