如何永远运行Python程序?


83

我需要在无限循环中永远运行我的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打电话?有什么想法吗?


那将是正确的方法。您不需要time.sleep(5),只要您while True:在行下缩进一些代码(可以将其缩进pass最少即可)
Holy Mackerel 2013年

1
如果要退出而不是终止进程,则添加一个中断条件-“ shutdown hook”很好。
user3020494

7
但是,如果您不睡觉,或做一些因外部事件而睡觉的事情(例如侦听连接或套接字上的数据),则您的程序将使用100%CPU,也就是busywait。这不是礼貌:)
qris

Python 3.5可以使用asyncio并将函数绑定到事件。使用GUI的程序可以处理ui事件循环(例如gtk.main())
eri

Answers:


99

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

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

#!/usr/bin/python

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

另外,time.sleep用于将脚本的操作暂停一段时间。因此,由于您希望自己的设备连续运行,所以我不明白为什么要使用它。


通过.bat文件启动python代码时,True似乎不起作用
BarryMahnly,

1
可以time.sleep通过等待1毫秒而不是以其最大速度运行来提高性能?
538ROMEO,

34

这个怎么样?

import signal
signal.pause()

这将使您的程序进入睡眠状态,直到它从某个其他进程(或本身,在另一个线程)中接收到信号为止,从而使其知道该做某事了。


2
信号将停止线程。标题是关于永远的奔跑。类似于系统服务或守护程序。
2015年

1
那是否只会停止主线程,从而允许其他线程无限期地运行?
David V.

@David是的,这只会停止主线程。我只是测试确认。
塞缪尔

9

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

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

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

sleep方法始终返回None。


没有评论就投票了吗?在阅读该解决方案时,我喜欢它,因为它具有良好的可读性/可维护性。对此代码感兴趣的读者无需滚动即可找到循环间隔。
马特

1
@mustafa哪一个?解释一下自己,效果很好。
Porunga

1
在第一次执行之前不睡觉吗?我认为这不是一般人所期望的行为
noonex

5

对于操作系统的支持select

import select

# your code

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

5

这是完整的语法,

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

5

我知道这太旧了,但是为什么没人提到

#!/usr/bin/python3
import asyncio 

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

1
在尝试使程序永久运行时,我总是使用此功能。我也不知道为什么没人提起这个问题
madladzen

1

我有一个小脚本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

仅捕获客户端代码中的KeyboardInterruptSystemExit异常,而不是拥有专用的类,是否容易得多(并且使用Python语言编写)?
马修·科尔

我用它来封装,我喜欢它的读取方式。显然,当我使用它时,interruptableloop的实现并没有引起我的注意。
Riaz Rizvi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.