如何使用 def 函数进行无限循环?

How do i make a infinite loop with def function?

我编写了一个程序,每 5 秒检查一次日志文件中的特定单词。 当它找到那个词时,它会发出一些声音并覆盖日志文件。 问题是在某个时候我得到:

RuntimeError: maximum recursion depth exceeded while calling a Python object.

有没有更好的方法来制作这个循环?

import time
import subprocess
global playalarm

def alarm():
    if "No answer" in open("/var/log/hostmonitor.log").read():
        print "Alarm!"
        playalarm=subprocess.Popen(['omxplayer','/root/Alarm/alarm.mp3'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,close_fds=True)
        log = open("/var/log/hostmonitor.log","w")
        log.write("Checked")
        log.close()
        time.sleep(5)
        playalarm.stdin.write('q')
        alarm()
    else:
        print"Checked"
        time.sleep(5)
        alarm()

alarm()

你可以像这样使用无限循环

def alarm():
    while True:
        if "No answer" in open("/var/log/hostmonitor.log").read():
            print "Alarm!"
            playalarm=subprocess.Popen(['omxplayer','/root/Alarm/alarm.mp3'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,close_fds=True)
            log = open("/var/log/hostmonitor.log","w")
            log.write("Checked")
            log.close()
            time.sleep(5)
            playalarm.stdin.write('q')
        else:
            print"Checked"
            time.sleep(5)

这个错误

RuntimeError: maximum recursion depth exceeded

你得到是因为 alarm() 函数的无限递归调用。每个递归调用都需要一定量的堆栈内存。栈space是有限的,递归调用一定次数后栈会溢出。为了防止这种情况,Python限制了递归的最大深度。
在您的情况下,您根本不需要递归。

使用while True

代码:

def func():
    while true:
        #Remaining function

有关 while loop look in to this SO question

的更多信息

while True 将永远 运行 你必须使用 Ctrl+c 或在循环

中使用 break 来停止它

每次 alarm() 调用自身时,您都会使用更多的堆栈 space,最终 运行 会被淘汰,因为供应不是无限的。

你需要的是一个循环:

def alarm():
    while True:
        if "No answer" in open("/var/log/hostmonitor.log").read():
            print "Alarm!"
            playalarm=subprocess.Popen(['omxplayer','/root/Alarm/alarm.mp3'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,close_fds=True)
            log = open("/var/log/hostmonitor.log","w")
            log.write("Checked")
            log.close()
            time.sleep(5)
            playalarm.stdin.write('q')
        else:
            print"Checked"
            time.sleep(5)

但是您应该记住,结束该程序的唯一方法是将其终止(例如使用 CTRL-Ckill)。可能值得重新考虑它,以便您可以以更干净的方式将其关闭。