Python 无意无限循环

Python 无意无限循环,python,infinite-loop,Python,Infinite Loop,我刚刚开始学习Python,在Ardit Suice的课程中尝试一个练习时,我编写了以下代码来实现自定义网站拦截器: #!/usr/bin/env python3 import time import os from datetime import datetime as dt hosts_path = '/etc/hosts' tmp_path = '/tmp/hosts.tmp' site_list = [ 'www.facebook.com', 'mail.google.com'] de

我刚刚开始学习Python,在Ardit Suice的课程中尝试一个练习时,我编写了以下代码来实现自定义网站拦截器:

#!/usr/bin/env python3
import time
import os
from datetime import datetime as dt
hosts_path = '/etc/hosts'
tmp_path = '/tmp/hosts.tmp'
site_list = [ 'www.facebook.com', 'mail.google.com']

def write_hosts():
    hostfile = open(hosts_path, 'r')
    filecont = hostfile.read()
    hostfile.close
    for site in site_list:
        if not site in filecont:
            try:
                with open(hosts_path, 'a') as fh:
                    fh.write('127.0.1.1 ' + site + '\n')
                    print ("Wrote %s to hosts file %s" % (site, hosts_path))
            except PermissionError:
                print ("Sorry, you need to be admin to do this")

def write_fresh_hosts():
    testfile = open(tmp_path, 'w')
    hostfile = open(hosts_path, 'r')
    line=hostfile.readline()
    while line:
        for site in site_list:
            if not site in line:
                testfile.write(line)
            else:
                print ("Deleting %s from our blocked list" % site)
        line=hostfile.readline()

    testfile.close
    hostfile.close
    os.rename(tmp_path, hosts_path)

while True:
    print(1)
    print (dt.now())
    upper=dt(dt.now().year, dt.now().month, dt.now().day, 20, 0)
    lower=dt(dt.now().year, dt.now().month, dt.now().day, 17, 0)
    if lower <= dt.now() <= upper:
        print ("Blocking now")
        write_hosts()
        time.sleep(5)
    else:
        print ("Checking website lists for already blocked sites:")
        write_fresh_hosts()
        time.sleep(5)
在我的文件末尾,我找到了以下行:

127.0.1.1   www.facebook.com
127.0.1.1   mail.google.com
最初,hosts文件只包含一行:

127.0.0.1       localhost
输出:

sudo python siteblocker.py 
Checking website lists for already blocked sites:
Checking website lists for already blocked sites:
... (repeated)

我哪里出错了?

在代码的这一部分:

while line:
    for site in site_list:
        if not site in line:
            testfile.write(line)
        else:
            print ("Deleting %s from our blocked list" % site)
    line=hostfile.readline()
对于主机文件的每一行,您都在迭代您的
站点\u列表。每次在
中找不到给定的
站点
,您就是在编写
。由于您的
站点列表中有两个条目,而这两个条目都不在
localhost
行中,因此每行写两次


由于您随后将新生成的输出文件作为新的输入文件,因此每次调用都会将文件中的行数有效地增加一倍。

此外,您并没有真正关闭文件。这可能是一个问题,当你重命名后…你能解释为什么while循环与readline是一个问题吗?它不是很好,但它不是无限的。我错过了循环中的读线。然而,密切相关的问题是真实的。使用带有括号的
.close()
。我为close添加了括号。它仍然在向hosts文件写入无限多的行。我想补充一点,目前我的时间在“阻塞”时间之外。所以我想我需要的是在写这行代码后立即中断。
while line:
    for site in site_list:
        if not site in line:
            testfile.write(line)
        else:
            print ("Deleting %s from our blocked list" % site)
    line=hostfile.readline()