如何使用python切换hosts文件


Posted in Python onApril 29, 2020

做开发或测试时常需要切换hosts ,如果hosts比较多,那么频繁的打开hosts文件对地址加注释(#),再把去掉注释是个繁琐的事情。

当然,SwitchHosts 已经可以帮我们方便的解决了这个繁琐的事情。

https://github.com/oldj/SwitchHosts

但笔者还是自己尝试用python写个小程序来实现切换。以需求为驱动来解决日常的问题是件非常有意思的事。

假如我们有一组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

写代码之前想清楚几点。

1、hosts 文件一般放在我们的C:\WINDOWS\system32\drivers\etc\目录下,没有扩展名。我们可以通过记事本打开。python 的os模块可以用于打开本地文件。

2、我们要做的操作也很简单,加注释(加#号),去掉注释(去掉#号)。去掉注释时,当我打开浏览器访问www.baidu.com 时,其实访问的是本地的,172.168.12.107 主机。加上注释时,那么访问的就是真的百度服务器。

3、我们要做的操作是判断,每一行数据的第一个字符是否有#号,没有的话就加上。

打开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)的方式打开HOST文件,readlines() 方法逐行的读取内容。然后,close()关闭文件。

程序再以写(w)的方式打开HOST文件,对readlines() 获取的每一行数据判断是否有#号,没有的话加上。并通过write() 方法写入到HOST文件中。最后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定义一个数组,直接写入到HOST文件。通过

写入不同的数组来达到切换不同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()

上面的方式会更加简单,把定义的host数组写到HOST文件中,注意:每写一个数组元素需要加一个回车换行---write("\n")

如果想继续增加切换host的便捷性,可以使用wxPython写一个host的配置界面出来,那么也就是我们的SwitchHosts 工具了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
使用python检测手机QQ在线状态的脚本代码
Feb 10 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
Nov 01 Python
用Python实现大文本文件切割的方法
Jan 12 Python
几行Python代码爬取3000+上市公司的信息
Jan 24 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
使用python模拟高斯分布例子
Dec 09 Python
基于python监控程序是否关闭
Jan 14 Python
Python csv文件记录流程代码解析
Jul 16 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 #Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 #Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 #Python
Python通过Pillow实现图片对比
Apr 29 #Python
Python unittest单元测试框架实现参数化
Apr 29 #Python
Python ORM框架Peewee用法详解
Apr 29 #Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 #Python
You might like
PHP APC的安装与使用详解
2013/06/13 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
深入理解Javascript中的this关键字
2015/03/27 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
python3中编码获取网页的实例方法
2020/11/16 Python
如何利用find命令查找文件
2016/11/18 面试题
建筑结构施工求职信
2014/07/11 职场文书
爱晚亭导游词
2015/02/09 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
公司保洁员管理制度
2015/08/04 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js