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

时间:2015-08-06 07:25:14

标签: python function infinite-loop

我编写了一个程序,每5秒检查一个日志文件以获取一个指定单词。 当它发现该字时会产生一些噪音并覆盖日志文件。 问题是在我得到一些观点之后:

  

RuntimeError:调用Python对象时超出了最大递归深度。

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

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()

3 个答案:

答案 0 :(得分:5)

你可以像

一样使用无限循环
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:超出最大递归深度

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

答案 1 :(得分:5)

每次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)

但是你应该记住,结束该程序的唯一方法是将其删除(例如,使用 CTRL-C kill)。重新思考它可能是值得的,这样你就可以更清洁地关闭它。

答案 2 :(得分:4)

使用while True

<强>码

def func():
    while true:
        #Remaining function

有关while loop look in to this SO question

的更多信息

while True将永远运行您必须使用Ctrl+c或在循环内使用break来停止它