很多的Python代码中都需要用命令行传参,之前一直都是直接copy别人写好的代码,这次想好好学习记录一下,以备后续查看。
# test.py
import argparse
def parse_args():
parser = argparse.ArgumentParser(description='Training With Pytorch.')
parser.add_argument('--world-size', default=-1, type=int, help='number of nodes for distributed training')
parser.add_argument('--rank', default=-1, type=int, help='node rank for distributed training')
parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str,
help='url used to set up distributed training')
parser.add_argument('--dist-backend', default='nccl', type=str,
help='distributed backend')
parser.add_argument('--seed', default=None, type=int,
help='seed for initializing training.')
parser.add_argument('--gpu', default=None, type=int,
help='GPU id to use.')
parser.add_argument('--multiprocessing-distributed', action='store_true',
help='Use multi-processing distributed training to launch')
parser.add_argument('--no-cuda', action='store_true', default=False,
help='disables CUDA training')
return parser
parser = parse_args()
args = parser.parse_args()
以上是一段比较常用的命令行解析代码。
- 导入argparse包
argparse是我们主要要用的一个库,其已经内置与Python中,无需额外安装。
接下来可以选择像参考代码一样定义函数去解析命令行,或者是直接解析也行,但出于代码整洁角度考虑,建议使用函数进行解析并返回。 - 创建一个解析器
parser = argparse.ArgumentParser(description='Training With Pytorch.')
这个ArgumentParse
对象包含将命令行解析成Python数据类型所需的全部信息。其也有很多参数可以传入,但是常用的一般就是description
用于在参数帮助文档之前进行显示:
python test.py -h
usage: test.py [-h] [--world-size WORLD_SIZE] [--rank RANK] [--dist-url DIST_URL] [--dist-backend DIST_BACKEND] [--seed SEED] [--gpu GPU] [--multiprocessing-distributed] [--no-cuda]
Training With Pytorch.
optional arguments:
-h, --help show this help message and exit
--world-size WORLD_SIZE
number of nodes for distributed training
--rank RANK node rank for distributed training
--dist-url DIST_URL url used to set up distributed training
--dist-backend DIST_BACKEND distributed backend
--seed SEED seed for initializing training.
--gpu GPU GPU id to use.
--multiprocessing-distributed Use multi-processing distributed training to launch
--no-cuda disables CUDA training
- 定义参数并设定相关属性
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:
- name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
用于指示该参数,当不加-时,表示位置参数,其余则表示关键字参数,-表示缩写,–表示全名。 - action - 当参数在命令行中出现时使用的动作基本类型。
store
- 存储传入的参数值,这也是默认的action。
store_const
- 存储被const命名的参数指定的值:parser.add_argument('--foo', action='store_const', const=42)
。
store_true
和store_false
- 存储True和False值,默认值分别为False和True。
append
- 存储一个列表,并且将每个参数值追加到列表中。 - nargs - 命令行参数应当消耗的数目。
nargs 命名参数关联不同数目的命令行参数到单一动作。支持的值有:
N
- 命令行中的 N 个参数会被聚集到一个列表中。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
?
- 如果可能的话,会从命令行中消耗一个参数,并产生一个单一项。如果当前没有命令行参数,则会产生 default 值。注意,对于选项,有另外的用例 - 选项字符串出现但没有跟随命令行参数,则会产生 const 值。
+
和 *
类似 - 所有当前命令行参数被聚集到一个列表中。
- const - 被一些 action 和 nargs 选择所需求的常数。
- default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
- type - 命令行参数应当被转换成的类型。
- choices - 可用的参数的容器。
某些命令行参数应当从一组受限值中选择。 这可通过将一个容器对象作为 choices 关键字参数传给 add_argument() 来处理。 当执行命令行解析时,参数值将被检查,如果参数不是可接受的值之一就将显示错误消息: - required - 此命令行选项是否可省略 (仅选项可用)。
通常,argparse 模块会认为 -f 和 --bar 等旗标是指明 可选的 参数,它们总是可以在命令行中被忽略。 要让一个选项成为 必需的,则可以将 True 作为 required= 关键字参数传给 add_argument() - help - 一个此选项作用的简单描述。
- metavar - 在使用方法消息中使用的参数值示例。
当 ArgumentParser 生成帮助消息时,它需要用某种方式来引用每个预期的参数。 默认情况下,ArgumentParser 对象使用 dest 值作为每个对象的 “name”。 默认情况下,对于位置参数动作,dest 值将被直接使用,而对于可选参数动作,dest 值将被转为大写形式。 因此,一个位置参数 dest=‘bar’ 的引用形式将为 bar。 一个带有单独命令行参数的可选参数 --foo 的引用形式将为 FOO。 - dest - 被添加到 parse_args() 所返回对象上的属性名。
PS.args解析时,会替换name中的’-‘为’_’,例如:
parser.add_argument('--dist-backend', default='nccl', type=str, help='distributed backend')
需要通过args.dist_backend
来获取。
参考文档:
https://zhuanlan.zhihu.com/p/56922793
https://docs.python.org/zh-cn/3/library/argparse.html