如何使用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 相关文章推荐
打印出python 当前全局变量和入口参数的所有属性
Jul 01 Python
Python去掉字符串中空格的方法
Mar 11 Python
Python中if __name__ == "__main__"详细解释
Oct 21 Python
Python面向对象之继承代码详解
Jan 29 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
python实现XML解析的方法解析
Nov 16 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python实现的分层随机抽样案例
Feb 25 Python
python如何更新包
Jun 11 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者的疑难问答(2)
2006/10/09 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
微信小程序表单验证功能完整实例
2017/12/01 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
django 读取图片到页面实例
2020/03/27 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
悦木之源美国官网:Origins美国
2016/08/01 全球购物
入党积极分子思想汇报范文
2014/01/05 职场文书
自动一体化专业求职信
2014/03/15 职场文书
春游踏青活动方案
2014/08/14 职场文书
针对吵架老公保证书
2015/05/08 职场文书
资金申请报告范文
2015/05/14 职场文书
同意离婚答辩状
2015/05/22 职场文书
考试后的感想
2015/08/07 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
golang实现浏览器导出excel文件功能
2022/03/25 Golang