如何使用 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-C 或 kill
)。可能值得重新考虑它,以便您可以以更干净的方式将其关闭。
我编写了一个程序,每 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-C 或 kill
)。可能值得重新考虑它,以便您可以以更干净的方式将其关闭。