web-dev-qa-db-fra.com

Comment exécuter le programme Python pour toujours?

Je dois exécuter mon programme Python pour toujours dans une boucle infinie.

Actuellement, je le lance comme ça - 

#!/usr/bin/python

import time

# some python code that I want 
# to keep on running


# Is this the right way to run the python program forever?
# And do I even need this time.sleep call?
while True:
    time.sleep(5)

Y a-t-il une meilleure façon de le faire? Ou ai-je même besoin d'appels time.sleep? Des idées?

47
user2467545

Oui, vous pouvez utiliser une boucle while True: qui ne se rompt jamais pour exécuter le code Python de manière continue. 

Cependant, vous devrez mettre le code que vous voulez exécuter continuellement dans la boucle:

#!/usr/bin/python

while True:
    # some python code that I want 
    # to keep on running

De plus, time.sleep est utilisé pour suspendre l'opération d'un script pendant une période donnée. Donc, puisque vous voulez que le vôtre fonctionne continuellement, je ne vois pas pourquoi vous l'utiliseriez.

65
iCodez

Celui-ci, ça va?

import signal
signal.pause()

Cela laissera votre programme en veille jusqu'à ce qu'il reçoive un signal d'un autre processus (ou de lui-même, dans un autre thread), lui indiquant qu'il est temps d'agir.

26
roarsneer

pour les systèmes d'exploitation prenant en charge select:

import select

# your code

select.select([], [], [])
4
gnr

Voici la syntaxe complète, 

#!/usr/bin/python3

import time 

def your_function():
    print("Hello, World")

while True:
    your_function()
    time.sleep(10) #make function to sleep for 10 seconds
2
Balaji.J.B

le sommeil est un bon moyen d'éviter la surcharge du processeur

je ne sais pas si c'est vraiment intelligent, mais j'utilise habituellement

while(not sleep(5)):
    #code to execute

la méthode sleep renvoie toujours None.

1
Porunga

Tout le code ci-dessus vous aidera sûrement à exécuter votre code indéfiniment, mais si vous voulez exécuter le code en arrière-plan avec Nohup.

Nohup pythonScript.py
1
Robins.Deepak

J'ai un petit script interruptableloop.py qui exécute le code à intervalle (par défaut, 1 s), envoie un message à l'écran pendant son exécution et intercepte un signal d'interruption que vous pouvez envoyer avec CTL-C:

#!/usr/bin/python3
from interruptableLoop import InterruptableLoop

loop=InterruptableLoop(intervalSecs=1) # redundant argument
while loop.ShouldContinue():
   # some python code that I want 
   # to keep on running
   pass

Lorsque vous exécutez le script puis que vous l'interrompez, vous voyez cette sortie (les périodes s'écoulent à chaque passage de la boucle):

[py36]$ ./interruptexample.py
CTL-C to stop   (or $kill -s SIGINT pid)
......^C
Exiting at  2018-07-28 14:58:40.359331

interruptableLoop.py :

"""
    Use to create a permanent loop that can be stopped ...

    ... from same terminal where process was started and is running in foreground: 
        CTL-C

    ... from same user account but through a different terminal 
        $ kill -2 <pid> 
        or $ kill -s SIGINT <pid>

"""
import signal
import time
from datetime import datetime as dtt
__all__=["InterruptableLoop",]
class InterruptableLoop:
    def __init__(self,intervalSecs=1,printStatus=True):
        self.intervalSecs=intervalSecs
        self.shouldContinue=True
        self.printStatus=printStatus
        self.interrupted=False
        if self.printStatus:
            print ("CTL-C to stop\t(or $kill -s SIGINT pid)")
        signal.signal(signal.SIGINT, self._StopRunning)
        signal.signal(signal.SIGQUIT, self._Abort)
        signal.signal(signal.SIGTERM, self._Abort)

    def _StopRunning(self, signal, frame):
        self.shouldContinue = False

    def _Abort(self, signal, frame):
        raise 

    def ShouldContinue(self):
        time.sleep(self.intervalSecs)
        if self.shouldContinue and self.printStatus: 
            print( ".",end="",flush=True)
        Elif not self.shouldContinue and self.printStatus:
            print ("Exiting at ",dtt.now())
        return self.shouldContinue
0
Riaz Rizvi