本文借阅了各网站大佬的经验,已将原文附 Reference 部分,再此表达最诚挚的谢意,如有侵权,本人立即删除!
argparse 是一个 Python 模块:命令行选项、参数和子命令解析器。
argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
parser = argparse.ArgumentParser(description='Process some integers.')
使用 argparse 的第一步是创建一个 ArgumentParser 对象。
ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。
>>> parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
ArgumentParser 通过 parse_args() 方法解析参数。
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
prog
- 程序的名称(默认:sys.argv[0])usage
- 描述程序用途的字符串(默认值:从添加到解析器的参数生成)description
- 在参数帮助文档之前显示的文本(默认值:无)epilog
- 在参数帮助文档之后显示的文本(默认值:无)parents
- 一个 ArgumentParser 对象的列表,它们的参数也应包含在内formatter_class
- 用于自定义帮助文档输出格式的类prefix_chars
- 可选参数的前缀字符集合(默认值:’-’)fromfile_prefix_chars
- 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)argument_default
- 参数的全局默认值(默认值: None)argument_default
- 参数的全局默认值(默认值: None)add_help
- 为解析器添加一个 -h/–help 选项(默认值: True)allow_abbrev
- 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name or flags
- 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。action
- 当参数在命令行中出现时使用的动作基本类型。nargs
- 命令行参数应当消耗的数目。const
- 被一些 action 和 nargs 选择所需求的常数。default
- 当参数未在命令行中出现时使用的值。default
- 当参数未在命令行中出现时使用的值。choices
- 可用的参数的容器。required
- 此命令行选项是否可省略 (仅选项可用)。help
- 一个此选项作用的简单描述。metavar
- 在使用方法消息中使用的参数值示例。dest
- 被添加到 parse_args() 所返回对象上的属性名。~~~~~~ 当我们执行某个 Python 代码,例如文件 mycode.py 时,想要传递一些可以随时改变的自定义的参数。比如在训练神经网络的时候,我们为了方便修改训练的 batch 大小,epoch 的大小等等,往往不想去动代码。此时最方便的方法就是在执行代码的时候从命令行传入参数。argparse.ArgumentParser() 可以很好地满足这一需求。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
args = parser.parse_args()
print(args.square**2)
~~~~~~ 改代码首先创建一个 ArgumentParser 对象,添加参数 square,最后采用方法 parser.add_argument。每添加一个参数,就需要调用一次该方法。args = parser.parse_args() 则是使得改代码生效。执行这段代码时,我们在命令行输入
python mycode.py 9
可以得到输出结果是 9 的平方,即 81。
当然,添加多个参数时,执行的时候顺序输入这些参数。例如 mycode.py 中是如下代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
parser.add_argument("number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)
我们在命令行输入:
python mycode.py 20 999
输出:
400
999
argparse.ArgumentParser():创建对象
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument("square", help="display a square of a given number", type=int)
parser.add_argument("number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)
parser.print_help()
其中 parser.print_help() 的功能是我们创建的 parser 的相关信息。命令行输入:
400
999
usage: day1.py [-h] square number
PyTorch MNIST pruning from deep compression paper
positional arguments:
square display a square of a given number
number display a given number
optional arguments:
-h, --help show this help message and exit
可以看到,description 中的文字也得到了输出。
parser.add_argument():
添加参数
parser.add_argument():
可配置的参数比较多,第一个是name,也就是名称。前面的例子中,我们用了
parser.add_argument("square", help="display a square of a given number", type=int)
~~~~~~ 其中 “square” 就是传递给 name 的参数(也可以单引号的 ’square’ )。这里还有个 help 参数,他和argparse.ArgumentParser() 中的 description 类似,没有实际作用,起到一个注释的作用,会在 parser.print_help() 后打印出来。而显然 type 参数指定了输入参数的类型,int 是整数,float 是浮点,str 是字符串。
回到 name 参数,他除了可以直接用上面的 square 字符串,也可以一个横杠加字符串以及两个横杠加字符串,例如 ’-sqaure
’ 和 ’–square
’ 。常见的是两个横杠的写法。下面来说说我个人发现的区别。没有横杠的写法,如我们前面所示,在命令行传入参数的时候,不需要重写名字,直接输入参数:
python mycode.py 20 999
但是假如使用两个横杠的 name,直接传入参数会报错,需要在传入参数的时候重写 name。例如下列代码
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument("--square", help="display a square of a given number", type=int)
parser.add_argument("--number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)
命令行执行时需要
python mycode.py --square 20 --number 999
另外一个需要提到的点是name的取名时,字符串中的横杠和下划线似乎是等价的。例如
parser.add_argument('--batch_size', type=int, default=50)
和
parser.add_argument('--batch-size', type=int, default=50)
是等价的。但是传递参数的时候,name是横杠也得用横杠;name是下划线也得用下划线:
parser.add_argument('--batch_size', type=int, default=50)
$ python mycode.py --batch_size 128
或者
parser.add_argument('--batch-size', type=int, default=50)
$ python mycode.py --batch-size 128
调用的时候统一用下划线:
print(args.batch_size)
个人建议传递 name 的时候还是用下划线别用横杠,方便查找。这里 default 用于定义没有传递参数时,该参数的默认值。需要注意的是,name 参数用横杠的名称的时候设置default 值,命令行执行程序的时候可以不传入参数或者传入部分参数,没传入的参数使用默认值;name 参数用没有横杠的名称的时候,必须传入参数。
下面的 parser.add_argument() 用到了 action 参数:
parser.add_argument('--no-cuda', action='store_true',help='disables CUDA training')
action='store_true’ 表示如果我们在命令行配置这个参数,则该参数为 True;不配置则默认为 False。类似的 action='store_false’ 表示如果我们在命令行配置这个参数,则该参数为 False;不配置则默认为 True。配置 action 类型的参数不需要传入具体的数值或者字符串,例如上例中,只需要
python mycode.py ----no-cuda
则表示对该参数进行了配置,他会被设为 True。更多 action 的类型可以参考官方文档
metavar 参数只对用 parser.print_help() 打印参数信息的时候会有影响,并不影响程序的其他功能。例如
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument('--batch_size', type=int, default=50,
help='input batch size for training (default: 50)')
args = parser.parse_args()
parser.print_help()
打印结果为:
usage: day1.py [-h] [--batch_size BATCH_SIZE]
PyTorch MNIST pruning from deep compression paper
optional arguments:
-h, --help show this help message and exit
--batch_size BATCH_SIZE
input batch size for training (default: 50)
假如设置 metavar 参数:
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument('--batch_size', type=int, default=50, metavar='N',
help='input batch size for training (default: 50)')
args = parser.parse_args()
parser.print_help()
打印结果为
usage: day1.py [-h] [--batch_size N]
PyTorch MNIST pruning from deep compression paper
optional arguments:
-h, --help show this help message and exit
--batch_size N input batch size for training (default: 50)
可见,只是改变了一些参数的显示。
为传递多个参数,可以用 nagrs。当 nargs 为 1 时,有且只能传入一个参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--one', nargs=1, required=True)
args = parser.parse_args()
print(args.one)
输出
python mycode.py --one 1
['1']
当 nargs 为其他数值,例如3时,表示必须传入3个参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--three', nargs=3, required=True)
args = parser.parse_args()
print(args.three)
输出
python mycode.py --three 1 2 3
['1', '2', '3']
当设置了 nargs 参数,则输出是一个 list。
dest 参数可以改变 argparse.ArgumentParser() 对应的参数调用时候的名称。例如下面这一段
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
如果第二个参数没有 dest=‘accumulate’,则在调用的时候,最后一行代码只能是
print(args.sum(args.integers))
dest 使得它在调用的时候被改名。但要注意在命令行传入参数的时候仍然是用name的字符串,即–sum。
[1] 官方文档
[2] 命令行传递参数 argparse.ArgumentParser解析
[3] argparse.ArgumentParser()用法解析