Hoe een script automatisch opnieuw starten?

Hoe laat u een Python-programma automatisch opnieuw opstarten? Dus laten we zeggen dat er een heel eenvoudig programma is zoals:

var = input("Hi! I like cheese! Do you like cheese?").lower()
if var == "yes":
    print("That's awesome!")

Nu, in een Python-schaal, moet u op de knop drukken en vervolgens 'Module (F5)' of alleen de toets F5 uitvoeren op uw toetsenbord . Dat is de eerste keer dat je het uitvoert. Wanneer het programma eindigde, zou u teruggaan naar uw Cheese.py-bestand en druk vervolgens op F5 om het programma opnieuw uit te voeren.

Iedereen hier met mij?
OK, dus mijn vraag is, hoe laat je het programma zichzelf automatisch opnieuw opstarten zonder dat je het handmatig moet doen?


Antwoord 1, Autoriteit 100%

Het hangt af van wat je bedoelt met "Start zichzelf opnieuw op." Als u dezelfde code voortdurend wilt uitvoeren, kunt u deze in een functie inpakken en vervolgens van binnen een while TrueLOOP, zoals:

>>> def like_cheese():
...     var = input("Hi! I like cheese! Do you like cheese?").lower()  # Corrected the call to `.lower`.
...     if var == "yes":
...         print("That's awesome!")
...
>>> while True:
...     like_cheese()
...
Hi! I like cheese! Do you like cheese?yes
That's awesome!
Hi! I like cheese! Do you like cheese?yes
That's awesome!

Als u eigenlijk wilt Start het script opnieuw op. U kunt het script opnieuw uitvoeren, het huidige proces vervangen door de nieuwe door het volgende te doen:

#! /bin/env python3
import os
import sys
def like_cheese():
    var = input("Hi! I like cheese! Do you like cheese?").lower()
    if var == "yes":
        print("That's awesome!")
if __name__ == '__main__':
    like_cheese()
    os.execv(__file__, sys.argv)  # Run a new iteration of the current script, providing any command line args from the current iteration.

Hierdoor wordt het script continu opnieuw uitgevoerd, waarbij de opdrachtregelargumenten van de huidige versie naar de nieuwe versie worden gegeven. Een meer gedetailleerde bespreking van deze methode is te vinden in het bericht "Een Python-script binnen zichzelf opnieuw opstarten" door Petr Zemek.

Eén item dat dit artikelnotities is:

Als u de bovenstaande oplossing gebruikt, houd er dan rekening mee dat de exec*()
functies zorgen ervoor dat het huidige proces onmiddellijk wordt vervangen,
zonder geopende bestandsobjecten leeg te spoelen. Daarom, als je er een hebt
geopende bestanden op het moment dat u het script opnieuw opstart, moet u doorspoelen
ze met behulp van f.flush()of os.fsync(fd)voordat u een exec*()aanroept
functie.


Antwoord 2, autoriteit 12%

Ik gebruik terminal op mijn Mac om sommige van mijn python-scripts opnieuw te starten met de onderstaande functie.

import subprocess  
def run_again(cmd):
    subprocess.call(["bash", "-c", "source ~/.profile; " + cmd])  

Opmerking: vergeet de spatie niet na "profile;" of de functie kan stil mislukken!

Vervolgens onderaan mijn script om opnieuw te starten:

if some_condition:  
    run_again("python my_script.py %s" % my_new_arguments)  

Voor de oorspronkelijke vraag over het kaasscript:

if var != 'yes':  
    run_again("python my_cheese_script.py")  

Antwoord 3, autoriteit 9%

of je kunt het proberen

$ chmod a+x "name".py

Vervolgens kunt u het script uitvoeren via

$ ./daemon.py

Gebruik in een dergelijke situatie de volgende code om het script opnieuw te starten:

os.execv(__file__, sys.argv)

Anders, wanneer u het script uitvoert via

$ python daemon.py

gebruik deze code:

os.execv(sys.executable, ['python'] + sys.argv)

Vergeet hoe dan ook niet de sys module

te importeren


Antwoord 4, autoriteit 6%

Je kunt iets in while True:plaatsen om het herhaaldelijk uit te voeren, aangezien Truealtijd zal evalueren tot True, zoals dit:

while True:
    var = input("Hi! I like cheese! Do you like cheese?").lower() # <-- You had missed parentheses here        
    if var == "yes":
        print("That's awesome!")

Er is echter een ander probleem met uw code; je hebt lowerniet aangeroepen door er haakjes achter te zetten.


Antwoord 5, autoriteit 6%

Je kunt gewoon een shellscript zoals test.sh gebruiken en ervoor zorgen dat je in je Linux-terminal chmod +x test.sh

Wat betreft de code:

#!/bin/bash
while :
do
  sleep 5
  gnome-terminal --wait -- sh -c "python3 myscript.py 'myarg1'"
done

Other episodes