argparse传参模块调用

要点:

官网链接:argparse — Parser for command-line options, arguments and sub-commands

参考博客:keras框架入门学习(一)——argparse传参模块调用

嗨课网教程 Python argparse命令行参数解析


需求背景描述:

当我们执行某个Python代码,例如文件test.py时,想要传递一些可以随时改变的自定义的参数。比如在训练神经网络时,我们为了方便修改训练的batch大小,epoch大小等,而不改动主代码。此时最方便的方法就是在执行代码的时候从命令行传入参数。argparse.ArgumentParser()可以很好地满足这一需求。

一、argparse模块简介

1.1 argparse的定义

argparse定义: argparse是python标准库里面用来处理命令行参数的库,可以用来方便地读取命令行参数。

1.2 基本语法

import argparse  #导入模块
parser = argparse.ArgumentParser()
parser.add_argument() 
parser.parser_args() 

说明:首先,使用 ArgumentParser() 创建解析对象,接着,使用 add_argument 向该对象中添加使用到的命令行选项和参数,最后,使用 parser_args 解析命令行。

1.2.1 argparse.ArgumentParser

使用 argparse 的第一步是创建 ArgumentParser 对象,ArgumentParser 对象保存了所有必要的信息,用以将命令行参数解析为相应的 Python 数据类型。比如:

parser = argparse.ArgumentParser(description='Process some integers.')

1.2.2 parser.add_argument

调用 add_argument()向 ArgumentParser 对象添加命令行参数信息,这些信息告诉 ArgumentParser 对象如何处理命令行参数。可以通过调用 parse_agrs() 来使用这些命令行参数。例如:

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)')

1.2.3 parser.parse_args

通过调用parse_args()来解析ArgumentParser对象中保存的命令行参数:将命令行参数解析成相应的数据类型并采取相应的动作,它返回一个Namespace对象。

parser.parse_args(['--sum', '7', '-1', '42'])
1、创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
"""创建一个 ArgumentParser 对象:"""
2、添加参数
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)')
"""本例中解析参数时将会返回一个具有 integers 和 accumulate 两个属性的对象。integers 属性将是一个包含一个或多个整数的列表,而 accumulate 属性当命令行中指定了 --sum 参数时将是 sum() 函数,否则则是 max() 函数。"""
3、解析参数
parser.parse_args(['--sum', '7', '-1', '42'])

输出结果:
>>>  Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
"""通过 parse_args() 方法解析参数;
在脚本中,通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数。"""

二  argparse模块参数说明

2.1 ArgumentParser

ArgumentParser参数说明:

  • prog - 程序的名称(默认:sys.argv[0])
  • usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
  • description - 在参数帮助文档之前显示的文本(默认值:无)
  • epilog - 在参数帮助文档之后显示的文本(默认值:无)
  • parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
  • formatter_class - 用于自定义帮助文档输出格式的类
  • prefix_chars - 可选参数的前缀字符集合(默认值:’-’)
  • fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)
  • argument_default - 参数的全局默认值(默认值: None)
  • conflict_handler -解决冲突选项的策略(通常是不必要的)
  • add_help - 为解析器添加一个 -h/–help 选项(默认值: True)
  • allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)

2.2 add_argument() 方法

add_argument() 基本语法:

add_argument() 参数说明:

  • name or flags - 若为位置参数,则需要传入名字;若为可选参数,则需要进行定义,一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。

  • action - 定义传入的参数如何处理,即:当参数在命令行中出现时使用的动作基本类型。

  • nargs - 命令行参数应当消耗的数目。

  • const - 被一些 action 和 nargs 选择所需求的常数。const,一种是定义action='store_const’或action=‘append_const’时使用。一种是定义nargs=’?'时,可选项出现在命令行中,但之后并没有跟随赋值的参数,作为默认值传给此可选项。

  • default - 当参数未在命令行中出现时使用的值。如果是一个字符串,那么Parser解析的时候会将它作为命令行传入值,使用type的值来进行转换类型,但是如果不是的话,就会使用定义的值而不进行类型转换。如果设置了nargs=’?‘或nargs=’*’,那么当没有参数赋值给该项时,会使用default定义的值。而default=argparse.SUPPRESS时,则表示命令行中未出现某一项时,不会对它进行默认赋值。
  • type - 命令行参数应当被转换成的类型。
  • choices - 可用的参数的容器,给定了取值范围,超出会报错。
  • required - 此命令行选项是否可省略 (仅选项可用)。默认情况下,可选项(通常前面有’-’,如:-f这样的选项是可选的)被认为并不一定需要出现在命令行参数中,但是如果设置了required=True的话,则其必须出现在命令行参数中。(注意:此类设置应避免使用,否则运行.py文件时,default默认传参方式失效,必须在命令行传入相应参数,否则程序报错。 )
  • help - 一个此选项作用的简单描述。
  • metavar - 在使用方法消息中使用的参数值示例。在Parser生成帮助信息时,需要有字符代表需要传入的值。(这一段和dest相同,使用的就是dest的值)如果是位置参数,则用它本身代替;如果是可选参数,则使用它的大写来代替。使用metavar可替换默认的字符。
  • dest - 被添加到 parse_args() 所返回对象上的属性名。

2.3 parse_args() 方法

parse_args() 基本语法:

ArgumentParser.parse_args(args=None, namespace=None)

parse_args() 参数说明:

args - 要分析的字符串列表。默认值取自sys.argv。
namespace -获取属性的对象。默认值是新的空 Namespace对象。

2.4 add_argument() 方法中参数变量的定义规则

parser.add_argument()可配置的参数比较多,第一个是name参数,也就是名称。例如,在下面的例子中"square"就是传递给name的参数变量(也可以单引号的’square’),type参数指定了输入参数的类型,int是整数,float是浮点,str是字符串。

parser.add_argument("square", help="display a square of a given number", type=int)

name参数的书写方式及区别:

  • 直接用自定义的name字符串,例如:‘square’或者"square"。在命令行传入参数的时候,不需要重写名字,直接输入参数;
  • 可以一个横杠加name字符串,例如:’-sqaure’;
  • 可以两个横杠加name字符串,例如:’–square’。在命令行传入参数的时候,需要在传入参数的时候重写名字+输入参数(常见的是两个横杠的写法)
  • 其中,’-n’,’–name’表示同一个参数,前者为后者的别称。最后采用对象的parse_args获取解析的参数时,当'-'和'--'同时出现的时候,系统默认后者为参数名,前者不是,但是在命令行输入的时候没有这个区分。

default参数的调用规则:

  • 这里default参数用于定义没有传递参数时,该参数的默认值。需要注意的是:
  • name参数用有横杠的名称时设置default值,命令行执行程序的时候可以不传入参数或者传入部分参数,没传入的参数使用默认值;
  • name参数用没有横杠的名称时,必须传入参数。

action参数的调用规则:

  • action=’store_true’,表示如果我们在命令行配置这个参数,则该参数为True;不配置则默认为False。
  • action=’store_false’,类比可知,表示如果我们在命令行配置这个参数,则该参数为False;不配置则默认为True。
  • 配置action类型的参数不需要传入具体的数值或者字符串,若取默认值,直接省略;若修改默认值,直接参数传入相反bool值即可。

nargs参数的调用规则:

  • ArgumentParser对象通常将一个动作与一个命令行参数关联。nargs关键字参数将一个动作与不同数目的命令行参数关联在一起,实现传递多个参数的效果。
  • 当nargs不设置时,默认只能传入一个参数,输出是一个value;
  • 当nargs为1时,有且只能传入一个参数,输出是长度为1的列表:
  • 当nargs=N时,表示必须传入N个参数,输出是长度为N的列表。
  • nargs=?,如果没有在命令行中出现对应的项,则给对应的项赋值为default。特殊的是,对于可选项,如果命令行中出现了此可选项,但是之后没有跟随赋值参数,则此时给此可选项并不是赋值default的值,而是赋值const的值。
  • nargs=*,和N类似,但是没有规定列表长度。
  • nargs=+,和*类似,但是给对应的项当没有传入参数时,会报错error: too few arguments。
  • nargs=argparse.REMAINDER,所有剩余的参数,均转化为一个列表赋值给此项,通常用此方法来将剩余的参数传入另一个parser进行解析。如果nargs没有定义,则可传入参数的数量由action决定,通常情况下为一个,并且不会生成长度为一的列表。
     

三 实操案例

3.1 应用范例

假设有一个demo.py文件,内容如下:

import argparse

"""
该代码首先创建一个ArgumentParser对象;
然后,使用parser.add_argument添加参数square。每添加一个参数,就需要调用一次该方法。
最后,通过args=parser.parse_args()使代码生效。
"""

parser = argparse.ArgumentParser()
parser.add_argument("--none", help="display a given number", required=True, type=int)
parser.add_argument('--one', nargs=1, required=True)
parser.add_argument('--three', nargs=3, required=True)
args = parser.parse_args()

print("命令行输入参数none为:", args.none)   # 调用参数变量
print("计算命令行输入参数none的平方:", args.none**2)   # 调用参数变量,并执行运算
print("命令行输入参数one为:", args.one)   # 调用参数变量
print("命令行输入参数three为:", args.three)   # 调用参数变量

parser.print_help()

命令行shell执行demo.py文件,输入参数如下:

(py36) zhang@zhangdeMacBook-Air Chapter2 % Python demo.py --none 2 --one 3 --three 4 5 6

打印输出结果如下:

命令行输入参数none为: 2
计算命令行输入参数none的平方: 4
命令行输入参数one为: ['3']
命令行输入参数three为: ['4', '5', '6']
usage: import argparse.py [-h] --none NONE --one ONE --three THREE THREE THREE

optional arguments:
  -h, --help            show this help message and exit
  --none NONE           display a given number
  --one ONE
  --three THREE THREE THREE

3.1.1 dest参数的调用规则

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))

3.2 案例二

import argparse

def main():

#设置一些参数
	# 创建命令行解析器句柄
	parser = argparse.ArgumentParser(description='自定义描述信息,本脚本执行功能为:演示 argparse 模块')
    parser.add_argument('--device', default='0,1,2,3', type=str, required=False, help='设置使用哪些显卡')
    parser.add_argument('--model_config', default='config/model_config_small.json', type=str, required=False,help='选择模型参数')
    parser.add_argument('--tokenizer_path', default='cache/vocab_small.txt', type=str, required=False, help='选择词库')
    parser.add_argument('--raw_data_path', default='data/train.json', type=str, required=False, help='原始训练语料')
    parser.add_argument('--tokenized_data_path', default='data/tokenized/', type=str, required=False,help='tokenized语料存放位置')
    parser.add_argument('--raw', action='store_true', help='是否先做tokenize')
    parser.add_argument('--epochs', default=5, type=int, required=False, help='训练循环')
    parser.add_argument('--batch_size', default=8, type=int, required=False, help='训练batch size')
    parser.add_argument('--lr', default=1.5e-4, type=float, required=False, help='学习率')
    parser.add_argument('--warmup_steps', default=2000, type=int, required=False, help='warm up步数')
    parser.add_argument('--log_step', default=1, type=int, required=False, help='多少步汇报一次loss,设置为gradient accumulation的整数倍')
    parser.add_argument('--stride', default=768, type=int, required=False, help='训练时取训练数据的窗口步长')
    parser.add_argument('--gradient_accumulation', default=1, type=int, required=False, help='梯度积累')
    parser.add_argument('--fp16', action='store_true', help='混合精度')
    parser.add_argument('--fp16_opt_level', default='O1', type=str, required=False)
    parser.add_argument('--max_grad_norm', default=1.0, type=float, required=False)
    parser.add_argument('--num_pieces', default=100, type=int, required=False, help='将训练语料分成多少份')
    parser.add_argument('--min_length', default=128, type=int, required=False, help='最短收录文章长度')
    parser.add_argument('--output_dir', default='model/', type=str, required=False, help='模型输出路径')
    parser.add_argument('--pretrained_model', default='', type=str, required=False, help='模型训练起点路径')
    parser.add_argument('--writer_dir', default='tensorboard_summary/', type=str, required=False, help='Tensorboard路径')
    parser.add_argument('--segment', action='store_true', help='中文以词为单位')
    parser.add_argument('--bpe_token', action='store_true', help='subword')
    parser.add_argument('--encoder_json', default="tokenizations/encoder.json", type=str, help="encoder.json")
    parser.add_argument('--vocab_bpe', default="tokenizations/vocab.bpe", type=str, help="vocab.bpe")

    args = parser.parse_args()

    print('args:\n' + args.__repr__())

#设置完后接下来可以使用这些参数
    if args.segment:
        from tokenizations import tokenization_bert_word_level as tokenization_bert
    else:
        from tokenizations import tokenization_bert

    os.environ["CUDA_VISIBLE_DEVICES"] = args.device  # 此处设置程序使用哪些显卡
-----------------------------------
required    - 必需参数,通常-f这样的选项是可选的,但是如果required=True那么就是必须的了 

猜你喜欢

转载自blog.csdn.net/March_A/article/details/130842347
今日推荐