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
相关产品推荐
相关产品推荐

