You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python初学者求助:自定义网站拦截器代码出现无意无限循环问题

嘿,我看到你在跟着Ardit Suice的课程做练习时,写网站拦截器代码遇到了无意的无限循环问题,咱们一起来排查修复~

诊断与修复你的网站拦截器无限循环问题

先从你给出的代码片段里找明显问题,再梳理可能引发无限循环的逻辑漏洞:

1. 立即修正的语法错误

你代码里的hostfile.close少了括号,应该写成hostfile.close()——如果不调用这个方法,文件对象不会正确关闭,可能导致后续文件操作异常,甚至引发重复读写的循环问题。

2. 可能引发无限循环的核心逻辑问题

这类网站拦截器通常会定时执行写入/恢复hosts的操作,如果你的主循环没有设置终止条件或者合理的执行间隔,就会一直无间隔重复执行,造成无限循环。另外,如果write_hosts函数里的写入逻辑没有做去重判断,每次都重复添加站点,也可能导致程序陷入重复写入的死循环。

修复后的完整示例代码

#!/usr/bin/env python3
import time
import os
from datetime import datetime as dt

hosts_path = '/etc/hosts'
redirect = '127.0.0.1'  # 拦截后指向本地地址
site_list = [
    'www.facebook.com',
    'mail.google.com'
]

def write_hosts(block_sites):
    # 用with语法自动管理文件,避免手动关闭的错误
    with open(hosts_path, 'r') as hostfile:
        filecont = hostfile.read()
    
    with open(hosts_path, 'w') as hostfile:
        if block_sites:
            # 需要拦截:先保留原hosts内容,再添加拦截规则(去重)
            hostfile.write(filecont)
            for site in site_list:
                if site not in filecont:
                    hostfile.write(f'{redirect} {site}\n')
        else:
            # 取消拦截:过滤掉已添加的拦截规则,恢复原内容
            lines = filecont.split('\n')
            new_content = '\n'.join([line for line in lines if not any(site in line for site in site_list)])
            hostfile.write(new_content)

if __name__ == '__main__':
    try:
        # 设置工作时间拦截(比如9点到18点)
        while True:
            current_time = dt.now()
            work_start = dt(current_time.year, current_time.month, current_time.day, 9)
            work_end = dt(current_time.year, current_time.month, current_time.day, 18)
            
            if work_start < current_time < work_end:
                write_hosts(block_sites=True)
                print("分心网站已拦截")
            else:
                write_hosts(block_sites=False)
                print("拦截已解除")
            # 每5分钟检查一次,避免无间隔循环占用资源
            time.sleep(300)
    except KeyboardInterrupt:
        # 允许用户按Ctrl+C手动终止程序
        print("\n程序已手动终止")

关键修复点说明

  • 用with open(...)语法自动管理文件关闭,彻底避免手动close的遗漏错误
  • 在write_hosts里加入去重判断,不会重复写入相同的拦截规则
  • 主循环加入时间区间判断和定时休眠(5分钟),既实现了定时拦截,又避免了无间隔的无限循环
  • 添加KeyboardInterrupt捕获,让用户可以随时手动终止程序

这样修改后,程序就能正常实现网站拦截功能,不会再出现无意的无限循环啦~

内容的提问来源于stack exchange,提问作者Joel G Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:30:20