Python实现Hosts文件一键切换:注释与取消注释脚本详解

江屿
江屿
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何使用Python编写简单脚本,实现对Windows系统Hosts文件的自动化管理。通过读取文件内容,判断行首字符是否为#号,程序可一键添加或移除注释,从而快速切换本地IP与真实域名的指向。文中提供了完整的代码示例,包括添加注释、去除注释以及直接写入配置数组的三种实现方式,帮助开发者高效处理测试环境中的域名解析切换问题。

Hosts文件切换的背景与需求

在软件开发或测试过程中,经常需要频繁切换Hosts配置。当Hosts条目较多时,手动打开文件进行注释(添加#)和取消注释的操作十分繁琐且容易出错。

虽然市面上已有SwitchHosts等工具能便捷地解决这一问题,但通过编程实现自定义切换逻辑同样具有实践价值。

SwitchHosts的官方仓库地址为:https://github.com/oldj/SwitchHosts。

尽管如此,笔者仍尝试使用Python编写一个小工具来实现Hosts切换功能。以实际需求为驱动来解决日常工作中的痛点,是一件极具乐趣的事情。

假设我们需要管理一组Hosts配置,内容如下:

172.168.12.107 www.baidu.com 172.168.10.213 account.baidu.com 172.168.12.107 pan.baidu.com 172.168.12.107 passport.baidu.com 172.168.10.129 is.baidu.com 172.168.12.107 un.baidu.com

Python实现Hosts切换的核心逻辑

在编写代码之前,需要明确几个关键逻辑点。

首先,Hosts文件通常位于C:\WINDOWS\system32\drivers\etc\目录下,且没有文件扩展名。我们可以使用记事本直接打开它。在Python中,可以利用os模块或内置的文件操作函数来读取本地文件。

其次,核心操作非常直观:即添加注释(在行首加#)和去除注释(移除行首#)。当Hosts文件中包含特定域名映射时,浏览器访问该域名会指向本地指定的IP(如172.168.12.107);若将该行注释,则请求将发往真实的百度服务器。

因此,程序的核心逻辑是判断每一行数据的第一个字符是否为#。如果不是,则在其前面添加#;如果是,则将其移除。

添加注释功能的代码实现

接下来,我们在Python Shell中练习添加“#”号的操作。


>>> abc = '127.168.10.107 www.baidu.com'
>>> a = abc[0]
>>> if a != '#':
  nabc = '#'+abc
  print nabc
#127.168.10.107 www.baidu.com

定义一个字符串abc,通过索引abc[0]获取其第一个字符。判断该字符是否不为#,如果条件成立,则将#号拼接在abc字符串的前面。

以下是添加注释功能的完整代码实现:


#coding=utf-8
import os

def add_jing():
  input = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'r')
  lines = input.readlines()
  input.close()

  output = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'w')
  for line in lines:
    if not line:
      break
    jing = line[0]
    if jing != '#':
      print line
      nf = '#' + line
      output.write(nf)
    else:
      output.write(line)

  output.close()
if __name__ == "__main__":
  add_jing()

程序首先以只读模式('r')打开HOSTS文件,使用readlines()方法逐行读取所有行内容,读取完毕后调用close()关闭文件。

随后,程序以写入模式('w')重新打开HOSTS文件。遍历之前读取的每一行数据,检查其首字符。如果该行没有#号,则添加#号后写入文件;如果已有#号,则原样写入。处理完所有行后,调用close()关闭文件以保存更改。

去除注释功能的代码实现

同样地,我们在Python Shell中练习移除“#”号的操作:


>>> abc = '#127.168.10.107 www.baidu.com'
>>> a = abc[0]
>>> if a == '#':
  nabc = abc.replace('#','')
  print nabc
127.168.10.107 www.baidu.com

逻辑与添加相反:获取字符串的第一个字符,如果判断为#号,则利用replace()方法将其替换为空字符串(''),从而去除注释。

以下是去除注释功能的完整代码:


def del_jing():
  input = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'r')
  lines = input.readlines()
  input.close()

  output = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'w')
  for line in lines:
    if not line:
      break
    jing = line[0]
    if jing == '#':
      print line
      nf = line.replace('#','')
      output.write(nf)
    else:
      output.write(line)

  output.close()

if __name__ == "__main__":
  del_jing()

基于数组配置的直接写入方案

通过调用add_jing()和del_jing()两个函数来切换Hosts的方式虽然可行,但灵活性稍显不足。上述方法仅通过修改#号来切换Hosts,实际上,我们也可以将Hosts配置定义为数组,直接写入HOSTS文件。

通过写入不同的配置数组,即可实现切换不同Hosts环境的目的。


#coding=utf-8
import os

'''内网测试环境'''
insides = ['172.168.12.107 www.baidu.com',
     '172.168.10.129 pan.baidu.com',
     '172.168.12.107 un.baidu.com',
     '172.168.12.107 passport.baidu.com']

'''外网测试环境'''
outsides = ['172.16.12.223 www.baidu.com',
      '172.16.10.223 pan.baidu.com',
      '172.16.12.111 un.baidu.com',
      '172.16.12.223 passport.baidu.com']


def inside_test():
  output = open(r'C:\pyse\HOSTS.txt', 'w')
  for insid in insides:
    print insid
    output.write(insid)
    output.write("\n")
  output.close()

def outside_test():
  output = open(r'C:\pyse\HOSTS.txt', 'w')
  for outsid in outsides:
    print outsid
    output.write(outsid)
    output.write("\n")
  output.close()  


if __name__ == "__main__":
  #inside_test()
  outside_test()

这种方式更为简洁。将定义好的Hosts数组写入HOSTS文件时,需要注意每写入一个数组元素后,必须添加一个回车换行符,即使用write("\n")。

如果希望进一步提升Hosts切换的便捷性,可以使用wxPython等GUI库开发一个配置界面,这实际上就是SwitchHosts这类工具的核心功能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表