原文:http://www.cnblogs.com/linxiyue/p/3908623.html
2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse模块对命令行进行解析。
1.example
有一道面试题:编写一个脚本main.py,使用方式如下:
main.py -u http://www.sohu.com -d 'a=1,b=2,c=3' -o /tmp/index.html
功能要求:打开-u指定的页面,将页面中所有的链接后面增加参数a=1&b=2&c=3(需要考虑链接中已经存在指定的参数的问题), 然后保存到-o指定的文件中。
2.创建解析器
class ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
创建一个ArgumentParser实例对象,ArgumentParser对象的参数都为关键字参数。
prog:程序的名字,默认为sys.argv[0],用来在help信息中描述程序的名称。
usage:描述程序用途的字符串
description:help信息前的文字。
epilog:help信息之后的信息
parents:由ArgumentParser对象组成的列表,它们的arguments选项会被包含到新ArgumentParser对象中。
formatter_class:help信息输出的格式,
prefix_chars:参数前缀,默认为'-'
fromfile_prefix_chars:前缀字符,放在文件名之前
当参数过多时,可以将参数放到文件中读取,例子中parser.parse_args(['-f', 'foo', '@args.txt'])解析时会从文件args.txt读取,相当于['-f', 'foo', '-f', 'bar']。
argument_default:参数的全局默认值。例如,要禁止parse_args时的参数默认添加,我们可以:
当parser.parse_args()时不会自动解析foo和bar了。
conflict_handler:解决冲突的策略,默认情况下冲突会发生错误:
我们可以设定冲突解决策略:
add_help:设为False时,help信息里面不再显示-h --help信息。
3.添加参数选项
add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name or flags:参数有两种,可选参数和位置参数。
添加可选参数:
添加位置参数:
parse_args()运行时,会用'-'来认证可选参数,剩下的即为位置参数。
解析时没有位置参数就会报错了。
action:默认为store
store_const,值存放在const中:
store_true和store_false,值存为True或False
append:存为列表
append_const:存为列表,会根据const关键参数进行添加:
count:统计参数出现的次数
help:help信息
version:版本
nargs:参数的数量
值可以为整数N(N个),*(任意多个),+(一个或更多)
值为?时,首先从命令行获得参数,若没有则从const获得,然后从default获得:
更常用的情况是允许参数为文件
const:保存一个常量
default:默认值
type:参数类型
choices:可供选择的值
required:是否必选
desk:可作为参数名
4.解析参数
参数有几种写法:
最常见的空格分开:
长选项用=分开
短选项可以写在一起:
parse_args()方法的返回值为namespace,可以用vars()内建函数化为字典: