Python 库学习 argparse
此库用来解析命令行选项,参数和子命令。
与sys.argv相比,它可以直接把命令行解析成想要参数,相当于在sys.argv的基础上又加了一层。我们接收到参数后免于sys.argv[0], sys.argv[1]去解析。比较适应于写一些通用性的脚本。
此整个库浓缩为3个函数,整体用法如下:
1、生成对象
parser = argparse.ArgumentParser()
2、设置如何解析命令行,也就是说设置如何把命令行参数转成我们的参数
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
3、 执行具体的参数解析,解析后的参数就放在args里面了,直接调用即可。args里面的key键就是第二步设置的参数名
args = parser.parse_args()
从此处可以看出,这部分的难度就是第二步,如何写一个参数,使得它可以把命令行解析成我们想要的样子。
下面我给出一些例子,从例子中去了解。如果例子没有包含你的需求,可以去访问此网站,对每个参数进行了详细的解释:https://docs.python.org/3/library/argparse.html#nargs
例子1:获取版本信息
parser.add_argument( '--version', action='version', version='Pecan %s' % '2') args = parser.parse_args() print(str(args)) python test.py --version ['test.py', '--version'] Pecan 2
在此例子中是增加一个参数信息,--version。当命令解析到命令行选项 --version时,就会执行action中的操作。
action的操作可以是一个自写的继承argparse.Action的类,也可以是内置的。此处version动作是内置的,他是打印出version参数中的内容。
例子2:在输入命令行时,要求命令是各种实际名称,但是代码中从解释器取变量时,却要求是同一个变量名去取
在使用add_argument时添加dest关键字
eg:
parser.add_argument( '-add ', dest='command_argv',) parser.add_argument( '-del ', dest='command_argv',)
此处有两个命令,-add -del,解析参数都,后面的参数都放到command_argv变量中
D:\document\coder\learn argparse>python test.py -add 1 ['test.py', '-add', '1'] Namespace(command_argv='1') D:\document\coder\learn argparse>python test.py -del 1 ['test.py', '-del', '1'] Namespace(command_argv='1')
例子3:可选与必选
在add_argument参数中,第一个参数也是必要的参数,是这个参数的名字,然后保存起来,尽管可以用dest参数去修改。
但是有些参数,我们是必须的,比如文件名。很简单,他第一个参数如果加了‘-’
则表示是可选的,不加‘-’
则是必选。你说我的参数名带了‘-’这个字符怎么搞?木有关系,这个识别符是可以改的,在生成这个对象的时候就需要定义好,如下所示
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+') >>> parser.add_argument('+f') >>> parser.add_argument('++bar') >>> parser.parse_args('+f X ++bar Y'.split()) Namespace(bar='Y', f='X')
可选与必选的演示如下所示
parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo') parser.add_argument('bar') print(parser.parse_args(['BAR'])) # 只有一个参数进入时,自动分配给必须要的bar变量 Namespace(bar='BAR', foo=None) # 都有时,把定义了时-foo的分配给foo,另外一个分配给bar parser.parse_args(['BAR', '--foo', 'FOO']) Namespace(bar='BAR', foo='FOO') # 当不给他bar分配参数时,则出错了 parser.parse_args(['--foo', 'FOO']) usage: PROG [-h] [-f FOO] bar PROG: error: the following arguments are required: bar