您的位置:首页 > 编程语言 > Python开发

python自动化配置脚本分析

2016-04-01 18:38 836 查看
python 默认ascii 编码,需要添加声明文件编码注释

# -*- coding: utf-8 -*-


OptionParser

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

optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。

引入

from optparse import OptionParser


创建OptionParser实例

usage= 'usage: %prog [options] arg'
version="%prog 1.0"
parser = OptionParser(usage=usage,version=version)


上面的%prog(自动解析为文件名)

如果用户没有提供自定义的使用方法信息,optparse 会默认使用: “usage: %prog [options]”, 当使用version参数的时候,optparse自动为你的解析器增加–version选项。

add_option()添加可解析命令

参数说明:

* action:工作方式,基本的有三种store、store_false、store_true,默认为store,是将命令行中你在-x 后面的输入存储到options字典中对应key的value位置。而store_false和store_true则是将相应的位置置为false和true

* type:类型(存储类型) 默认为string

* dest:存储的变量

* default:默认值

* help:帮助信息

parser.add_option("-f","--file",dest="filename",type="string",help="print file")
parser.add_option("-g","--give",action="store",type="int",dest="give",help="give int")
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")


之后就是对输入进行解析啦

(options, args) = parser.parse_args()

输出有两个

options,一个对象包含所有选项的值,如,如果–file接受一个字符串参数,那么option.file 将是用户提供的文件名,如果用户没有提供选项值那它就是None.

args,位置参数列表解析后剩下的选项参数

这样OptionParser就配置完了,举个小例子

定义了5个命令,-c -f -g -v -q

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from optparse import OptionParser
import os
import sys
def main () :
usage = "usage: %prog [options] "
version="%prog 1.0"
parser = OptionParser(usage=usage,version=version)
parser.add_option("-c", "--config", dest="config",help="read config from CONFIG FILE")
parser.add_option("-f","--file",dest="filename",type="string",help="print file")
parser.add_option("-g","--give",action="store",type="int",dest="give",help="give int")
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")
(options, args) = parser.parse_args()
print options, args
if options.give:
print options.give+1
if options.filename:
print options.filename
if not os.path.isfile(options.filename):
parser.error(options.filename + " is not a file")

if __name__ == "__main__"  :
main()


执行结果

python try2.py -v -f /opt/deploy/bin/temp.txt -g 10
{'give': 10, 'config': None, 'verbose': True, 'filename': '/opt/deploy/bin/temp.txt'} []
11
/opt/deploy/bin/temp.txt


这里由于都解析了,所以args的输出是一个空的list。

give的类型定义为int,所以可以进行运算

-v 命令将verbose项置为true

查看版本号

python try2.py --version
try2.py 1.0


filename非法的时候会返回error

python try2.py -f aaa

{'give': None, 'config': None, 'verbose': None, 'filename': 'aaa'} []
aaa
Usage: try2.py [options]

try2.py: error: aaa is not a file


查看帮助

python try2.py --help
Usage: try2.py [options]

Options:
--version             show program's version number and exit
-h, --help            show this help message and exit
-c CONFIG, --config=CONFIG
read config from CONFIG FILE
-f FILENAME, --file=FILENAME
print file
-g GIVE, --give=GIVE  give int
-v
-q


没处理的输入会存到argvs中

python try2.py -g 10  heiheihei
{'give': 10, 'config': None, 'verbose': None, 'filename': None} ['heiheihei']
11


另外action也可以是自己定义的函数,例如

parser.add_option("-f","--file",action=act(sys.argv[2:]),dest="filename",help="print file")


以上,我们基于OptionParser 写了个小脚本,可以解析命令行来获取信息,实现我们的效果。

try except

考虑到会存在输入非法的情况,那么我们就需要熟练使用判断异常的代码

捕捉某异常

try:
f = open("file-not-exists", "r")
except IOError,e:
print("open exception: %s: %s\n" %(e.errno, e.strerror))


老版本的Python,except语句写作”except Exception, e”,Python 2.6后应写作”except Exception as e”。

捕捉全部异常

try:
do something
except:
handle except


会捕获所有异常,包括键盘中断和程序退出请求(用sys.exit()就无法退出程序了,因为异常被捕获了),因此慎用。


使用

except Exception as e

可以捕获除与程序退出sys.exit()相关之外的所有异常。

else与finally

else表示如果try中的代码没有引发异常,则会执行else:

try:
f = open("foo", "r")
except IOError as e:
...
else:
data = f.read()


finally表示无论是否有异常,都将被执行:

try:
f = open("foo", "r")
except IOError as e:
...
finally:
f.close()


ConfigParser解析配置文件

函数

-read(filename) 直接读取文件内容

-sections() 得到所有的section,并以列表的形式返回

-options(section) 得到该section的所有option

-items(section) 得到该section的所有键值对

-get(section,option) 得到section中option的值,返回为string类型

-getint(section,option) 得到section中option的值,返回为int类型

举个例子吧

首先导入模块,然后建立一个针对目的文件的config对象,可以通过该对象读取配置文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ConfigParser

def main () :
config_file="/opt/deploy/bin/temp.conf"
config=ConfigParser.ConfigParser()
config.read(config_file)
hosts = config.get("env","hosts")
for host in hosts.split(","):
print "host",host
print config.items("example")
print config.options("example")
if __name__ == "__main__"  :
main()


配置文件结构

[section1]
option = value


文件内容

[env]
hosts =192.168.2.1,192.168.2.2,192.168.2.3
heiheihei=hohohoho
[example]
example1=1
example2=2
example3=3


输出结果

root@aaa# python try3.py
host 192.168.2.1
host 192.168.2.2
host 192.168.2.3
[('example1', '1'), ('example2', '2'), ('example3', '3')]
['example1', 'example2', 'example3']


思路还是很清晰的。跟上面的结合,就是可以将我们需要的section等内容通过脚本的args传进来,然后读文件相应内容就可以了

ssh

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: