如何永远运行Python程序?

时间:2013-11-24 02:04:56

标签: python infinite-loop

我需要在无限循环中永远运行我的Python程序..

目前我正在运行它 -

#!/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)

有没有更好的方法呢?或者我甚至需要time.sleep来电? 有什么想法吗?

10 个答案:

答案 0 :(得分:75)

是的,您可以使用永不中断的while True:循环来持续运行Python代码。

但是,您需要将要继续运行的代码放在循环中:

#!/usr/bin/python

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

此外,time.sleep用于暂停脚本的操作一段时间。所以,既然你希望你的不断运行,我不明白你为什么会这样做。

答案 1 :(得分:27)

这个怎么样?

import signal
signal.pause()

这会让你的程序一直处于睡眠状态,直到它收到来自其他进程(或其自身,另一个线程)的信号,让它知道是时候做某事了。

答案 2 :(得分:7)

我知道这是一个太旧的线程,但是为什么没人提到这个

#!/usr/bin/python3
import asyncio 

loop = asyncio.get_event_loop()
try:
    loop.run_forever()
finally:
    loop.close()

答案 3 :(得分:4)

支持select的操作系统:

import select

# your code

select.select([], [], [])

答案 4 :(得分:3)

睡眠是避免cpu过载的好方法

不确定它是否真的很聪明,但我通常使用

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

sleep方法总是返回None。

答案 5 :(得分:3)

这是完整的语法,

#!/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

答案 6 :(得分:0)

我有一个小脚本 interruptableloop.py ,该脚本以一定的间隔(默认1秒)运行代码,在运行时将消息泵出到屏幕上,并捕获一个中断信号,您可以使用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

当您运行脚本然后中断脚本时,您会看到以下输出(周期的每一步都抽出周期):

[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

答案 7 :(得分:0)

以上所有代码无疑可以帮助您无限执行代码,但是如果您想使用nohup在后台运行代码。

nohup pythonScript.py

答案 8 :(得分:0)

如果你的意思是作为服务运行,那么你可以使用任何休息框架

from flask import Flask
class A:
    def one(port):
        app = Flask(__name__)
        app.run(port = port)
        

称之为:

one(port=1001)

它会一直监听 1001

 * Running on http://127.0.0.1:1001/ (Press CTRL+C to quit)

答案 9 :(得分:-1)

它是我能想到的唯一方式之一。至于它是否合适,它取决于用例 - 网络服务器和事件循环有时会这样做。不,你绝对不需要time.sleep电话。