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传进来,然后读文件相应内容就可以了