在命令行程序中,经常需要获取命令行参数。Python内置的sys.argv
保存了完整的参数列表,我们可以从中解析出需要的参数:
运行上述copy.py
,并传入参数,打印如下:
这种方式能应付简单的参数,但参数稍微复杂点,比如可以使用-d
复制目录,使用--filename *.py
过滤文件名等,解析起来就非常麻烦。
为了简化参数解析,我们可以使用内置的argparse库,定义好各个参数类型后,它能直接返回有效的参数。
假设我们想编写一个备份MySQL数据库的命令行程序,需要输入的参数如下:
- host参数:表示MySQL主机名或IP,不输入则默认为
localhost
;
- port参数:表示MySQL的端口号,int类型,不输入则默认为
3306
;
- user参数:表示登录MySQL的用户名,必须输入;
- password参数:表示登录MySQL的口令,必须输入;
- gz参数:表示是否压缩备份文件,不输入则默认为
False
;
- outfile参数:表示备份文件保存在哪,必须输入。
其中,outfile
是位置参数,而其他则是类似--user root
这样的“关键字”参数。
用argparse
来解析参数,一个完整的示例如下:
输入有效的参数,则程序能解析出所需的所有参数:
缺少必要的参数,或者参数不对,将报告详细的错误信息:
更神奇的是,如果输入-h
,则打印帮助信息:
获取有效参数的代码实际上是这一行:
我们不必捕获异常,parse_args()
非常方便的一点在于,如果参数有问题,则它打印出错误信息后,结束进程;如果参数是-h
,则它打印帮助信息后,结束进程。只有当参数全部有效时,才会返回一个NameSpace对象,获取对应的参数就把参数名当作属性获取,非常方便。
可见,使用argparse
后,解析参数的工作被大大简化了,我们可以专注于定义参数,然后直接获取到有效的参数输入。
小结
使用argparse解析参数,只需定义好参数类型,就可以获得有效的参数输入,能大大简化获取命令行参数的工作。