文章目录(Table of Contents)
简介
argsparse
是 python
的命令行解析的标准模块,内置于 python
,不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。
特别是当我们将代码的功能全部完成之后,想要通过 shell
脚本快速测试不同的内容,这个时候就可以使用 argsparse
传入参数。
参考资料
- argparse模块用法实例详解,知乎专栏一篇很详细的说明,本文主要参考这篇文章;
- Python argparse介绍,关于「长选项」与「短选项」的相关介绍;
argparse 简单使用
传入参数
首先让我们来看一下最简单的 argsparse
使用的例子。 下面的代码中,我们可以传入一个数字。
- import argparse
- parser = argparse.ArgumentParser(description='命令行中传入一个数字')
- # type是要传入的参数的数据类型 help 是该参数的提示信息
- parser.add_argument('integers', type=str, help='传入的数字')
- args = parser.parse_args()
- #获得传入的参数
- print(args)
在运行上面代码的时候,我们可以进行外挂参数。例如首先输入 python demo.py -h
或是 python demo.py --help
,可以看到相关的帮助,也就是每一个参数的意思:
接着我们给该文件传入一个参数5
,运行结果如下所示。这里得到的这个结果Namespace(integers='5')
是一种类似于 python 字典的数据类型。
- Namespace(integers='5')
操作 args 字典
前面说到,argsparse
会将输入的数转换为 Namespace(integers='5')
的结构。我们可以通过 arg.参数名
来提取参数。稍微修改上面的代码(只需将最后一行变为下面的即可):
- # 获得 integers 参数
- print(args.integers)
此时在输入 python demo.py 5
,就会直接输出 5
。
传入参数的数据类型
add_argument
中有 type
参数可以设置传入参数的数据类型。我们看到代码中有 type
这个关键词,该关键词可以传入 list, str, tuple, set, dict
等。例如我们把上面的 type=str
,改成 type=int
,这时候我们就可以进行四则运算。
下面的代码中,我们传入两个数字,同时进行求和:
- import argparse
- parser = argparse.ArgumentParser(description='命令行中传入一个数字')
- # type是要传入的参数的数据类型 help 是该参数的提示信息
- parser.add_argument('integers_1', type=int, help='传入的数字 1')
- parser.add_argument('integers_2', type=int, help='传入的数字 2')
- args = parser.parse_args()
- sum_value = args.integers_1 + args.integers_2 # 求和
- print(f'{args.integers_1} + {args.integers_2} = {sum_value}')
运行上面的代码,传入数字 10
和 20
,得到结果是 30
,如下所示:
可选参数(推荐使用)
我们可以在关键词前面加 --
,来不按照顺序传入参数。例如在上面的例子中,外面传入的两个参数会分别赋值给 integers_1
和 integers_2
,我们也可以指定传入的顺序。
如下所示,我们首先传入 integers_2
的值,接着传入 integers_1
的值,这样就可以不按照 add_argument
的顺序传入参数了:
可选参数虽然写法比较繁琐,但是增加了命令行中的可读性,不容易因为参数传入顺序导致数据错乱。所以还是比较推荐写成「可选参数」的形式的。
可选参数-短选项
上面的可选参数设置为「长选项」,当然我们也可以设置为「短选项」。我们只需要将参数的传入部分改为如下的内容即可。
- parser = argparse.ArgumentParser(description='命令行中传入一个数字')
- # type是要传入的参数的数据类型 help 是该参数的提示信息
- parser.add_argument('-n_1', '--integers_1', type=int, help='传入的数字 1')
- parser.add_argument('-n_2', '--integers_2', type=int, help='传入的数字 2')
- args = parser.parse_args()
我们使用 help
来查看一下帮助,可以看到此时每个参数后面都都跟着两种写法,分别是「一个短横」和「两个短横」:
此时我们可以使用下面两种方式来运行该脚本:
- python test_argparse.py --integers_2=20 --integers_1=10
- python test_argparse.py -n_2=20 -n_1=10
argparse 设置参数默认值
add_argument
中有一个 default
参数。有的时候需要对某个参数设置默认值,即如果命令行中没有传入该参数的值,程序使用默认值。如果命令行传入该参数,则程序使用传入的值。
下面看一个具体的例子,上面做两个数的加法,其中第一个数有一个默认值是 100
。下面是关键的代码,中间添加了 default
参数:
- parser = argparse.ArgumentParser(description='命令行中传入一个数字')
- # type是要传入的参数的数据类型 help 是该参数的提示信息
- parser.add_argument('-n_1', '--integers_1', type=int, default=100, help='传入的数字 1')
- parser.add_argument('-n_2', '--integers_2', type=int, help='传入的数字 2')
- args = parser.parse_args()
运行上面的代码的时候,可以不指定第一个参数 n_1
,那么默认就是 100
。当然也是可以指定的,运行结果如下所示:
argparse 设置必须参数
add_argument
有一个 required
参数可以设置该参数是否必需。上面我们指定了第一个参数 n_1
是有默认值的。现在我们加一个 required=True
,此时就必须对其输入参数,否则就会出现报错:
我们将 required=True
在第一个参数中加上:
- parser = argparse.ArgumentParser(description='命令行中传入一个数字')
- # type是要传入的参数的数据类型 help 是该参数的提示信息
- parser.add_argument('-n_1', '--integers_1', type=int, default=100, required=True, help='传入的数字 1')
- parser.add_argument('-n_2', '--integers_2', type=int, help='传入的数字 2')
- args = parser.parse_args()
运行上面的代码。第一次不指定参数 n_1
,就会出现报错。第二次进行指定,就可以正常运行。
VS Code 调试带有 argparse 的代码
这里我们单独说一下如何使用 vscode
调试带有 argparse
的代码。按照下图,点击对应的图标,此时会打开 launch.json。
接着在 configurations
再添加一个配置,可以将命令行传入的参数放在 args
里面,多个参数就按照下面按顺序写在列表中即可:
- {
- "name": "Python: Current File with Args",
- "type": "python",
- "request": "launch",
- "program": "${file}",
- "console": "integratedTerminal",
- "args": ["--key1", "value1", "value2", "--key2", "value3", "value4"],
- "justMyCode": true
- }
最后要调试相关代码的时候,如下图所示,首先选中刚刚添加的配置,接着点「调试按钮」即可:
参考资料:Visual Studio Code: How debug Python script with arguments
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论