如何使用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的面向对象思想分析
Jan 14 Python
python3简单实现微信爬虫
Apr 09 Python
Python中的ConfigParser模块使用详解
May 04 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
Python二叉搜索树与双向链表转换算法示例
Mar 02 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
在python中使用nohup命令说明
Apr 16 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
Python 如何展开嵌套的序列
Aug 01 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
jQuery 选择器详解
2015/01/19 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
原生js轮播特效
2017/05/18 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
python生成requirements.txt的两种方法
2019/09/18 Python
python retrying模块的使用方法详解
2019/09/25 Python
Django 解决由save方法引发的错误
2020/05/21 Python
python Timer 类使用介绍
2020/12/28 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
饭店工作计划书
2014/01/10 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
广告学专业求职信
2014/06/19 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
师德师风个人总结
2015/02/06 职场文书
保管员岗位职责
2015/02/14 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
Python合并多张图片成PDF
2021/06/09 Python