背景

命令行参数工具 Python 中常用的工具,比如做实验希望调节参数的时候,如果参数都是通过硬编码写在代码当中的话,每次修改参数都需要修改对应的代码和逻辑显然这不太方便。比较好的办法就是把必要的参数设置成通过命令行传入的形式,这样我们只需要在运行的时候修改参数就可以了。本文总结下三种好用的参数解析方法。

argparse

argparse 是 Python 自带的命令行解析库,比较常用但是参数解析部分略微有点繁琐,下面例子说明了其用法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# -*- coding: utf-8 -*-

"""
@Time : 2020/2/19 12:06
@Author : dreamhomes
@File : test.py
@Description: test file
"""
import argparse


def params_parser():
parser = argparse.ArgumentParser(description="test")

parser.add_argument('--param1', dest='param1', default='p1', type=str, help='input param1.')
parser.add_argument('--param2', dest='param2', default=1, type=int, help='input param2')
parser.add_argument('--param3', dest='param3', action='store_true', default=False, help='input param3')

return parser.parse_args()


if __name__ == '__main__':
args = params_parser()
print(f"param1: {args.param1}")
print(f"param2: {args.param2}")
print(f"param3: {args.param3}")

以上脚本在命令行中执行输出的结果为:

1
2
3
4
test git:(main) ✗ python test.py --param1 shenmengjia --param2 666 --param3
param1: shenmengjia
param2: 666
param3: True

这种参数解析方法的好处是不需要安装其它解析库,Python 自带的库即可解决问题。但是又稍微有点复杂,需要定义参数解析对象来逐一添加参数及其属性。那么有没有稍微简洁的方法呢,答案是有的,下面推荐另一个参数解析库 click

click

Click 是一个利用很少的代码以可组合的方式创造优雅命令行工具接口的 Python 库。 它是高度可配置的,但却有合理默认值的“命令行接口创建工具”,以函数修饰符的方式来解析参数。详细说明参考官方文档: https://click.palletsprojects.com/en/7.x/

安装方法:pip install click

下面以代码案例说明其用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-

"""
@Time : 2020/2/19 12:06
@Author : dreamhomes
@File : test.py
@Description: test file
"""
import click


@click.command("test")
@click.option('--param1', default='shenmengjia', type=str, help='input param1.')
@click.option('--param2', default=2, help='input param2.')
@click.option('--param3', default=True, type=bool, help='input param3.')
def main(param1, param2, param3):
""" parameters parser test """
print(f"param1: {param1}")
print(f"param2: {param2}")
print(f"param3: {param3}")


if __name__ == '__main__':
main()

使用 click 装饰符后就可以实现参数解析,--help 命令即可查看参数属性;

1
2
3
4
5
6
7
8
9
10
test git:(main) ✗ python test.py --help                                         
Usage: test.py [OPTIONS]

parameters parser test

Options:
--param1 TEXT input param1.
--param2 INTEGER input param2.
--param3 BOOLEAN input param3.
--help Show this message and exit.

同样地输出结果如下:

1
2
3
4
➜  test git:(main) ✗ python test.py --param1 shenmengjia --param2 666 --param3 True
param1: shenmengjia
param2: 666
param3: True

这种方法就比 argparse 库代码简洁多了,不需要定义对象再一一添加参数,需要注意参数和变量名字对应。

那么问题来了,有没有更简洁的方法呢?答案还是有的!!! 下面推荐另一个参数解析库 typer

typer

Typer 是基于Python 3.6+ 构建CLI应用程序的库,详细介绍文档可以参考官方文档:https://typer.tiangolo.com/,我只能说更强!!!

下面介绍下参数解析的用法。

安装方法:pip install typer

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding: utf-8 -*-

"""
@Time : 2020/2/19 12:06
@Author : dreamhomes
@File : test.py
@Description: test file
"""
import typer


def main(
param1: str = typer.Option(
default="shenmengjia", help="input param1."
),
param2: int = typer.Option(
default=1, help="input param2."
),
param3: bool = typer.Option(
default=True, help="input param3."
)):
"""parameters parser test"""
print(f"param1: {param1}")
print(f"param2: {param2}")
print(f"param3: {param3}")


if __name__ == '__main__':
typer.run(main)

对比以上两种方法,typer 更加简单,连参数和变量名的对应关系都不需要写!执行效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
test git:(main) ✗ python test.py --help
Usage: test.py [OPTIONS]

parameters parser test

Options:
--param1 TEXT input param1. [default: shenmengjia]
--param2 INTEGER input param2. [default: 1]
--param3 / --no-param3 input param3. [default: True]
--install-completion [bash|zsh|fish|powershell|pwsh]
Install completion for the specified shell.
--show-completion [bash|zsh|fish|powershell|pwsh]
Show completion for the specified shell, to
copy it or customize the installation.

--help Show this message and exit.

输出结果:

1
2
3
4
test git:(main) ✗ python test.py --param1 shenmengjia --param2 666 --param3     
param1: shenmengjia
param2: 666
param3: True

联系作者