python 常用的模块 optparse与ConfigParser

一、optparse 模块

功能:optparse模块用于处理命令行参数

使用流程:

1、首先,必须 import OptionParser 类,创建一个 OptionParser 对象:

from optparse import OptionParser

def Opt ():
   parser=OptionParser("Usage: %prog -o option -d domain -s subject")

2、使用 add_option 来定义命令行参数:

   parser.add_option("-d",
                      "--domain",
                      dest="domain",
                      default=False,
                      action="store_true",
                      help="special domain_name or domain_name/user",)
   parser.add_option("-s",
                      "--subject",
                      dest="subject",
                      default=False,
                      action="store_true",
                      help="special subject for record operational log",)
   parser.add_option("-o",
                      "--operation",
                      dest="operation",
                      default=False,
                      action="store_true",
                      help="special operation Del or Insert Key ",)
   options,args = parser.parse_args()
   return options,args
   #以上是定义参数与选项,返回对象与参数

选项说明:

每个命令行参数就是由参数名字符串和参数属性组成的。如 -d 或者 --domain 分别是长短参数名

dest: 是可选的。如果没有指定 dest 参数,将用命令行的参数名来对 options 对象的值进行存取

store:有两种形式:store_true和store_false,用于处理带命令行参数后面不带值的情况。如 -v,-q [-v 也可以认为查看版本-q表示退出时后面可以不带值]

default:可以为参数指定默认值;如果-f表示文件,但没有指定值,那么在解析时会直接找到default定义的默认值。

action是parse_args()方法的参数之一,它指示optparse当解析到一个命令行参数时该如何处理。actions 有一组固定的值可供选择,默认是‘store‘,表示将命令行参数值保存在 options 对象里。

help:定义帮助信息,是对参数的描述

3、生产中使用的完整例子:

这个脚本的功能其实就是对redis添加删除操作

#!/usr/bin/env python
#coding:utf-8
#Date: 2015-09-09
#Author:king.gp 
################描述#################
#
#查找是否设置此kye,有则跳过
#如果没有设置此kye,并将操作写入/var/log/redis_add_pause_domain_list.log中
#如果恢复指定的存在的key,也要写入到/var/log/redis_retrieve_pause_domain_list.log
#
####################################

import redis
import datetime
import os
import sys
from optparse import OptionParser

def Opt ():
   parser=OptionParser("Usage: %prog -o option -d domain -s subject")
   parser.add_option("-d",
                      "--domain",
                      dest="domain",
                      default=False,
                      action="store_true",
                      help="special domain_name or domain_name/user",)
   parser.add_option("-s",
                      "--subject",
                      dest="subject",
                      default=False,
                      action="store_true",
                      help="special subject for record operational log",)
   parser.add_option("-o",
                      "--operation",
                      dest="operation",
                      default=False,
                      action="store_true",
                      help="special operation Del or Insert Key ",)
   options,args = parser.parse_args()
   return options,args,parser
   #以上是定义参数与选项,返回对象与参数

def Connect_Redis(options,hostname,parser,*argv):
   r = redis.Redis(host=‘localhost‘,port=6379,db=‘0‘)
   if options.domain:
     key_string = hostname+‘/Conf/MailBox/‘+argv[1]+‘/Status_Pause_All‘
     key_list=r.keys(key_string)
     if (options.operation and  argv[0]==‘search‘):
       if len(key_list) > 0 :
         print key_list[0]+‘ Existing‘ 
       else:
         print key_string+‘ Not Existing‘
       sys.exit(0)   

     if (options.operation and options.subject and argv[0]==‘delete‘): 
        if  len(key_list)>0:
           r.delete(key_string)
         #print key_string
           print key_string+‘ alrealy Del!‘
           with open(‘/var/log/redis_retrieve_pause_domain_list.log‘,‘a‘) as f:
             now = datetime.datetime.now()  
             date_string = now.strftime("%Y-%m-%d %H:%M:%S")
             f.write(date_string+‘\t‘+argv[2]+‘\t‘+key_string+‘\n‘) 
           sys.exit(0)
        else: 
           print key_string+‘ Not Existing‘
           sys.exit(0)
     elif (options.operation and options.subject and argv[0] ==‘insert‘):
          r.set(key_string,‘1‘)
          print key_string+‘ alrealy Set!‘
          with open(‘/var/log/redis_add_pause_domain_list.log‘,‘a‘) as f:
            now = datetime.datetime.now()  
            date_string = now.strftime("%Y-%m-%d %H:%M:%S")
            f.write(date_string+‘\t‘+argv[2]+‘\t‘+key_string+‘\n‘)
          sys.exit(0)
     else:
        parser.error("domain or subject not empty")

   else:
      sys.exit(0)

def Get_Host_Name():
  host = os.popen(‘echo $HOSTNAME‘)
  hostname = host.read().strip()
  if len(hostname) > 4:
    hostname = hostname.split(‘.‘)[0]
  return hostname

def main():
    options,args,parser=Opt()
    if args:
      keys=tuple(args)
      hostname=Get_Host_Name()
      Connect_Redis(options,hostname,parser,*keys)
    else :
      parser.error("Usage: %prog -o option -d domain -s subject")
    
if __name__ == ‘__main__‘:
    main()

4、查看帮助

[[email protected] yunwei]# python change_redis_pause_key.py  -h
Usage: change_redis_pause_key.py -o option -d domain -s subject

Options:
  -h, --help       show this help message and exit
  -d, --domain     special domain_name or domain_name/user
  -s, --subject    special subject for record operational log
  -o, --operation  special operation Del or Insert Key

二、ConfigParser模块

1、功能:配置文件解析模块【我是这么理解的】

2、说明:配置文件要mysql的配置文件一样分区段;配置文件的格式:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。

3、函数说明:

    • 读取配置文件时的函数
read(filename) 直接读取ini文件内容
sections() 得到所有的section,并以列表的形式返回
options(section) 得到该section的所有option
items(section) 得到该section的所有键值对
get(section,option) 得到section中option的值,返回为string类型
getint(section,option) 得到section中option的值,返回为int类型,还有相应的getboolean()和getfloat() 函数。
    • 写入文件时的函数
add_section(section) 添加一个新的section
set( section, option, value) 对section中的option进行设置,需要调用write将内容写入配置文件。
    • 保存文件
conf.write(open(network_path+network_card,‘w‘))

4、写个例子

说明:迁移机房生成原IP与新IP的绑定到对应的配置文件中

bash-4.1$ cat network.py 
#!/usr/bin/env python
#conding:utf8

#
import sys
import os
import commands
import ConfigParser

class Netconf(ConfigParser.ConfigParser):
    def __init__(self,default=None):
       ConfigParser.ConfigParser.__init__(self,defaults=None)
    def optionxform(self,optionstr):
       return optionstr

def Def_Network(source_ip,network_card):
    str_card=network_card[:10]+‘\\‘+network_card[10:] #定义DEVICE:eth0:x
    network_path=‘/home/sysadmin/proxy_config/‘
    network_template=‘ifcfg-ethx‘
    network_full_path=network_path+network_template
    conf=Netconf()
    conf.read(network_full_path) 
    conf.set("network_card","IPADDR",source_ip)
    conf.set("network_card","DEVICE",network_card[6:])
    conf.write(open(network_path+network_card,‘w‘))
    cmd ="sed -i ‘[email protected] @@g‘ "+network_path+str_card
    (s,r)=commands.getstatusoutput(cmd)
    if s ==0:
      print "Success"
      #[‘ipv6init‘, ‘userctl‘, ‘dns2‘, ‘dns1‘, ‘ipaddr‘, ‘onboot‘, ‘netmask‘, ‘device‘, ‘type‘, ‘gateway‘]

def main():
  source_file=‘/home/sysadmin/proxy_config/unix_proxy.txt‘
  if os.path.exists(source_file):
     with open(source_file) as fn:
        data = fn.readlines()
        #print type(data)
        for ethx  in data:
           ethx=ethx.split(‘\t‘)
           C_IP=ethx[0].strip()
           N_IP=ethx[1].strip() 
           W_Card=ethx[2].strip()
           Def_Network(C_IP,W_Card)    
  else:    
    print " %s file not found" %source_file

if __name__==‘__main__‘:
    main()

注:遇到的问题,可能在其它服务的配置文件里不算什么问题,但是,在网卡设置中这是一个大的问题

    • 参数的大小写;ConfigParser模块中将所有读取的Key都变成了小写,而网卡的配置文件必须是大写;请查看ConfigParser模块的文件【我的是centos6.3x86_64系统,环境python2.6.6,路径为

/usr/lib64/python2.6/ConfigParser.py】

如果要解决这个问题有两种方式:

第一:要修改ConfigParser.py文件中的将return optinostr.lower()改成return optionstr即可。

354     def optionxform(self, optionstr):
355         return optionstr.lower()

第二:通过类继承,重写optionxfrom方法。

至于使用那种方法,请根据实际情况而定。

    • 生成的配置文件中,key = value等号两端有空格,配置文件不认,只好用sed命令替换了

5、原文件unix_proxy

1.2.3.4	 192.168.2.4	ifcfg-eth0:0
5.6.7.8	 192.168.2.8	ifcfg-eth0:1

6、模板文件ifcfg-ethx

[network_card]
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
IPADDR=1.2.3.4
NETMASK=255.255.254.0
DNS2=1.2.4.8
GATEWAY=1.2.3.1
IPV6INIT=no
USERCTL=no

运行脚本即可绑定网卡的配置文件

三、总结

1、要多写,多看【标准库】这里有中文版本的,有能力的小伙伴可以去试着翻译一下 http://python.usyiyi.cn/python_278/tutorial/index.html

2、承认自己的不足,才能进步

3、多总结

时间: 2024-12-18 10:56:08

python 常用的模块 optparse与ConfigParser的相关文章

Python 常用系统模块整理

Python中的常用的系统模块中部分函数等的整理 random: 随机数 sys: 系统相关 os: 系统相关的 subprocess: 执行新的进程 multiprocessing: 进程相关 threading: 线程相关 pickle: 将对象转换成二进制文件 time: 时间 datetime: 基本的日期和时间类型 timeit: 准确测量小段代码的执行时间 urllib: 访问网络的包 http.cookielib: 主要作用是提供可存储cookie的对象 socket: 套接字相关

[转] Python 常用第三方模块 及PIL介绍

原文地址 除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,即可用pip安装. 本文介绍常用的第三方模块. 一个图像处理库PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容

python 常用第三方模块

除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在https://pypi.python.org/pypi上注册,只要找到对应的模块名字,即可用pip安装. 本章介绍常用的第三方模块. 1. PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillo

Python常用的模块

一.logging模块 1.日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 #不设置 2.默认级别为warning,默认打印到终端 import logging logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.er

Python常用时间模块讲解

一.常用的时间格式1.时间戳格式,例如:t = 1523197272.9467547(s),单位为秒:2.结构化时间格式,例如:t=time.struct_time(tm_year=2018,tm_mon=4,tm_mday=8,tm_hour=22,tm_min=22,tm_sec=4,tm_wday=6,tm_yday=98, tm_isdst=0),里面包含年.月.日.时.分.秒.星期几(0表示周一)等:因此,可以随意取出想要的值,如下图:其实,time.localtime()是以time

男神鹏:python 常用的模块。

os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', 'os2', 'mac', 'ce' or 'riscos') os中定义了一组文件.路径在不同操作系统中的表现形式参数,如 os.sep(文件夹分隔符,windows中是 \ ) os.extsep(扩展名分隔符,windows中是 . ) os.pathsep(目录分隔符,windows中是 ; ) os.l

python常用小模块使用汇总

在写代码过程中常用到一些好用的小模块,现整理汇总一下: 1.获取当前的文件名和目录名,并添到系统环境变量中. file = os.path.abspath(__file__)                              #获取文件的绝对路径file_name = os.path.basename(file)                         #获取文件名file_dir = os.path.dirname(os.path.dirname(file))      #获取

python 常用的模块(struct)转

准确地讲,Python没有专门处理字节的数据类型.但由于str既是字符串,又可以表示字节,所以,字节数组=str.而在C语言中,我们可以很方便地用struct.union来处理字节,以及字节和int,float的转换. 在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的str,你得配合位运算符这么写: >>> n = 10240099 >>> b1 = chr((n & 0xff000000) >> 24) >>&

Python#常用的模块和简单用法

目录 random 随机模块 os 文件夹模块: time 时间模块: matplotlab.pyplot 作图模块 mpl_toolkits.mplot3d 绘制3D图模块 Pygame Requests 请求URL: 文章导读 random 随机模块 import random code = random.choice(stock_list) # 从一个列表中随机选取元素下面是我目前经常用到的模块,为了方便使用,不是有特殊需求的话,个人觉得一开始没比亚每个模块都很深入学习,只要知道自己常用的