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

  • 一、argparse模块简介
    • 1.1 argparse的定义
    • 1.2 argparse的优势
  • 二、argparse模块使用
    • 2.1 实现【解析命令行读取参数】的传统方法——sys.argv
    • 2.2 实现【解析命令行读取参数】的优化方法——argparse模块
  • 三、argparse模块参数说明
    • 3.1 ArgumentParser 对象
    • 3.2 add_argument() 方法
    • 3.3 parse_args() 方法
    • 3.4 add_argument() 方法中参数变量的定义规则
  • 四、argparse模块应用范例
    • 4.1 初级范例
    • 4.2 进阶范例
    • 4.3 python argparse传入布尔参数的正确做法

argparse官方教程:https://docs.python.org/3/library/argparse.html

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

需求背景描述:

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

一、argparse模块简介

1.1 argparse的定义

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

1.2 argparse的优势

argparse 模块可以让人轻松编写用户友好的命令行接口。首先,程序定义它需要的参数;然后,argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。此模块是 Python 标准库中推荐的命令行解析模块(python 中自带的模块,不需要再安装),使用时先导入模块,利用import argparse实现。

二、argparse模块使用

2.1 实现【解析命令行读取参数】的传统方法——sys.argv

使用 sys.argv 可以将命令行输入的运行脚本后的参数依次读取出来,并且读取进来的参数默认是字符串类型。比如有个 demo.py 脚本:

import sysprint("Input argument is %s" %(sys.argv))

在 shell 中执行,并会得到如下:

(py36) zhang@zhangdeMacBook-Air Chapter2 % Python demo.py how are you 123
>>>
Input argument is ['import argparse.py', 'how', 'are', 'you', '123']

2.2 实现【解析命令行读取参数】的优化方法——argparse模块

argparse的基本范式:

  1. 创建解析器
    创建一个ArgumentParser对象,如 parser = argparse.ArgumentParser()。ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。

  2. 添加参数
    通过调用add_argument()方法来给 ArgumentParser对象添加程序所需的参数信息;

  3. 解析参数
    调用parse_args()来解析参数。依据的是第二步制定的规则,生成的是一个Namespace对象。在脚本中,通常 parse_args() 会被不带参数调用,那么ArgumentParser 将默认从sys.argv来获取命令行入参数。

argparse的基本范式——基本样例

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模块参数说明

3.1 ArgumentParser 对象

ArgumentParser 基本语法:

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)

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)

3.2 add_argument() 方法

add_argument() 基本语法:

ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

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() 所返回对象上的属性名。

3.3 parse_args() 方法

parse_args() 基本语法:

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

parse_args() 参数说明:

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

3.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参数的书写方式及区别:

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

default参数的调用规则:

这里default参数用于定义没有传递参数时,该参数的默认值。需要注意的是:

  • name参数用有横杠的名称时设置default值,命令行执行程序的时候可以不传入参数或者传入部分参数,没传入的参数使用默认值;
  • name参数用没有横杠的名称时,必须传入参数。

action参数的调用规则:

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

典型范例参考 4.3 python argparse传入布尔参数的正确做法

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决定,通常情况下为一个,并且不会生成长度为一的列表。

应用范例:

假设有一个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 THREEoptional arguments:-h, --help            show this help message and exit--none NONE           display a given number--one ONE--three THREE THREE THREE

dest参数的调用规则:

dest参数可以改变argparse.ArgumentParser()对应的参数调用时候的名称。例如下面这一段:

import argparseparser = 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

metavar参数的调用规则:

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 paperoptional arguments:-h, --help            show this help message and exit--batch_size BATCH_SIZEinput 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 paperoptional arguments:-h, --help      show this help message and exit--batch_size N  input batch size for training (default: 50)

可见,只是改变了一些参数的显示。

action参数的调用规则:

action参数取值说明:

  • action=‘store’,默认取值,保存传入参数。
  • action=‘store_const’,需要添加const,意味着该argument的值不从命令行输入,而是取const的值。
  • action=‘store_true’ or action=‘store_false’,'store_const’的特殊情形,意味着const的值为True或False。
  • action=‘append’,表示传入的值会作为一个列表的一项,意味着option可以在命令行中多次出现。
  • action=‘append_const’,传入列表的项由const定义,通常用在需要多个argument将值传入一个列表中的场景。
  • action=‘count’,输出argument出现的次数。
  • action=‘help’,已默认添加。
  • action=‘version’,需要定义version,使用时输出版本信息并退出。
    自定义,通过定义一个argparse.Action子类来实现。实际上,上面的这些可选项都是通过这种形式定义的。

四、argparse模块应用范例

4.1 初级范例

初级范例——定义参数变量,并调用参数变量执行四则运算:

import argparse"""
该代码首先创建一个ArgumentParser对象;
然后,使用parser.add_argument添加参数square。每添加一个参数,就需要调用一次该方法。
最后,通过args=parser.parse_args()使代码生效。
"""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()
parser.print_help()  # 代码注释——自定义文本参数,可以用来描述这个程序是做什么的print("计算命令行输入参数的平方:", args.square**2)   # 调用参数变量,并执行运算
print("命令行输入参数为:", args.number)   # 调用参数变量

我们在命令行输入:

(py36) zhang@zhangdeMacBook-Air Chapter2 % Python test.py 20 999

可以得到输出结果是:

计算命令行输入参数的平方: 400
命令行输入参数为: 999usage: import argparse.py [-h] square numberpositional arguments:square      display a square of a given numbernumber      display a given numberoptional arguments:-h, --help  show this help message and exit

可以看到,通过parser.print_help()使得description中的文字也得到了输出。

4.2 进阶范例

初级范例——定义参数变量,并调用参数变量执行四则运算:

进阶范例一:

import argparsedef 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_bertelse:from tokenizations import tokenization_bertos.environ["CUDA_VISIBLE_DEVICES"] = args.device  # 此处设置程序使用哪些显卡
-----------------------------------
required    - 必需参数,通常-f这样的选项是可选的,但是如果required=True那么就是必须的了 

进阶范例二:

import argparseif __name__ == '__main__':# 创建命令行解析器句柄parser = argparse.ArgumentParser(description='自定义描述信息,本脚本执行功能为:演示 argparse 模块')# 没有横杆开头的是必填参数,并且按照输入顺序进行设定parser.add_argument('positionArg',help='定义必选参数 positionArg(help 属性为提示信息)')# --verbosity1:两个横线 -- 开头,指的是变量名或者称为标签# -v1:一个横线 - 开通,指的是变量的别名或者标签别名parser.add_argument('--verbosity1', '-v1', help='定义可选参数 verbosity1') # 定义可选参数 state# 设定 action='store_true' 表示该选项不需要接收参数# 若不设 action,则默认是需要接收参数的,否则会报错parser.add_argument('--state', '-s', action='store_true', help='若有 "-s" ,则 state = Ture,否则 state = False')# 执行参数的类型parser.add_argument('-int','-i', type=int, help='指定参数类型(默认是 str)')parser.add_argument('-c', help='设置参数的可选值,即输入值必须为 choices 列表中的某个值,若未设置则默认值为 None',choices=['one', 'two', 'three', 'four'],)parser.add_argument('--default','-d', help='default 可以设置默认值',choices=['one', 'two', 'three', 'four'],default = 'one',)# 参数是否必填,使用 required 属性parser.add_argument('--required','-r', help='required 的值为:True 或者 False',required=True,)# 最后:获取、解析参数的值args = parser.parse_args()  # 返回一个命名空间print(args)params = vars(args)  # 返回字典print(params,type(params))
在 shell 命令行中输入:
> python .demo2.py start -v1 10 -s -r helloworld
Namespace(c=None, default='one', int=None, positionArg='start', required='helloworld', state=True, verbosity1='10')
{'positionArg': 'start', 'verbosity1': '10', 'state': True, 'int': None, 'c': None, 'default': 'one', 'required': 'helloworld'} <class
'dict'>
查看帮助:-h 或者 -help,如:> python demo.py -h

在 shell 命令行中输入:

> python .demo2.py start -v1 10 -s -r helloworld
Namespace(c=None, default='one', int=None, positionArg='start', required='helloworld', state=True, verbosity1='10')
{'positionArg': 'start', 'verbosity1': '10', 'state': True, 'int': None, 'c': None, 'default': 'one', 'required': 'helloworld'} <class
'dict'>

参考链接:python 3 之 Argparse 模块简介【实现解析命令行读取参数】

进阶范例三:

import argparsedef main():parser = argparse.ArgumentParser(description="Demo of argparse")parser.add_argument('-n','--name', default=' Li ')parser.add_argument('-y','--year', default='20')parser.add_argument("-d", "--dataset", default="./dataset",help="path to input dataset of images")args = parser.parse_args()print("传递参数:",args)name = args.nameyear = args.yearprint('Hello {}  {}'.format(name,year))if __name__ == '__main__':main()输出结果:
>>>
传递参数: Namespace(dataset='./dataset', name=' Li ', year='20')
Hello  Li   20
#coding=utf-8
import argparse
import sysdef parse_args():parser = argparse.ArgumentParser(description='Train a Fast R-CNN network')parser.add_argument('--cfg', dest='cfg_file',help='optional config file',default=None, type=str)parser.add_argument('--weight', dest='weight',help='initialize with pretrained model weights',type=str)parser.add_argument('--imdb', dest='imdb_name',help='dataset to train on',default='voc_2007_trainval', type=str)parser.add_argument('--imdbval', dest='imdbval_name',help='dataset to validate on',default='voc_2007_test', type=str)parser.add_argument('--iters', dest='max_iters',help='number of iterations to train',default=70000, type=int)parser.add_argument('--tag', dest='tag',help='tag of the model',default=None, type=str)parser.add_argument('--net', dest='net',help='vgg16, res50, res101, res152, mobile',default='res50', type=str)parser.add_argument('--set', dest='set_cfgs',help='set config keys', default=None,nargs=argparse.REMAINDER) if len(sys.argv) == 1:print("打印help参数:")parser.print_help()#sys.exit(1)   # exit(1):有错误退出args = parser.parse_args()return argsif __name__ == '__main__':args = parse_args()print("传入参数:",args)

将以上代码保存为test_argparse.py ,然后在命令行输入:python test_argparse.py

打印help参数:
usage: test_argparse.py [-h] [--cfg CFG_FILE] [--weight WEIGHT][--imdb IMDB_NAME] [--imdbval IMDBVAL_NAME][--iters MAX_ITERS] [--tag TAG] [--net NET][--set ...]Train a Fast R-CNN networkoptional arguments:-h, --help            show this help message and exit--cfg CFG_FILE        optional config file--weight WEIGHT       initialize with pretrained model weights--imdb IMDB_NAME      dataset to train on--imdbval IMDBVAL_NAMEdataset to validate on--iters MAX_ITERS     number of iterations to train--tag TAG             tag of the model--net NET             vgg16, res50, res101, res152, mobile--set ...             set config keys
传入参数: Namespace(cfg_file=None, imdb_name='voc_2007_trainval', imdbval_name='voc_2007_test', max_iters=70000, net='res50', set_cfgs=None, tag=None, weight=None)***Repl Closed***

在命令行输入:

python  test_argparse.py --weight data/imagenet_weights/vgg16.ckpt \--imdb voc_2007_trainval \--imdbval voc_2007_test \--iters 7000 \--cfg experiments/cfgs/vgg16.yml \--net vgg16  \--set ANCHOR_SCALES "[8,16,32]" ANCHOR_RATIOS "[0.5,1,2]" TRAIN.STEPSIZE "[50000]"

结果为:

传入参数:Namespace(cfg_file='experiments/cfgs/vgg16.yml',imdb_name='voc_2007_trainval',imdbval_name='voc_2007_test', max_iters=7000, net='vgg16', set_cfgs=['ANCHOR_SCALES', '[8,16,32]', 'ANCHOR_RATIOS', '[0.5,1,2]', 'TRAIN.STEPSIZE', '[50000]'], tag=None, weight='data/imagenet_weights/vgg16.ckpt')

参考链接:python入门:argparse浅析 nargs=’+'作用

4.3 python argparse传入布尔参数的正确做法

问题描述:

# test.py
import argparsedef test_bool():parser = argparse.ArgumentParser(description="This code is used to test bool value.")parser.add_argument("--flag",type=bool,default=True)args = parser.parse_args()print("# The type of flag: ", type(args.flag))print(args.flag is False)if args.flag:print(f"# Flag: {True}")else:print(f"# Flag: {False}")if __name__ == '__main__':test_bool()

执行上面的代码:python3 test.py --flag False
按照执行的期望是输出# Flag: False,但是实际输出的结果是True。

(py36) zhangMacBook-Air Chapter2 % Python import\ argparse.py --flag False
# The type of flag:  <class 'bool'>
False
# Flag: True

为什么会出现这种情况呢?因为,在命令行的输入会被python认为是字符串,并不是布尔类型。

解决方法:

更改代码为:

# ***
parser.add_argument("--flag",action="store_true",help="Run or not.")
# ***

这样的话,当你不输入–flag的时候,默认为False;输入–flag的时候,才会触发True值。
看执行结果:

(data_parse)  ~/Desktop/code/cython&numba  python3 test.py
# The type of flag:  <class 'bool'>
True
# Flag: False
(data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag
# The type of flag:  <class 'bool'>
False
# Flag: True

当然这种方式,你也可以指定action为store_false,不输入的时候–flag默认True,输入–flag触发False。

参考链接:
python argparse传入布尔参数不生效解决
Python3学习总结——argparse.ArgumentParser()
命令行传递参数 argparse.ArgumentParser解析

keras框架入门学习(一)——argparse传参模块调用相关推荐

  1. Vue学习(组件传参)-学习笔记

    文章目录 Vue学习(组件传参)-学习笔记 父到子 子到父 父操作子-ref(类似于操作dom) 兄弟之间传参 Vue学习(组件传参)-学习笔记 父到子 Father:(index) <temp ...

  2. SSM框架入门学习记录

    SSM框架入门学习记录 //项目结构 在这里插入图片描述 在这里插入图片描述 包名多种多样,命名习惯问题. 流程:Controller(接受请求)-->Service(biz)(bl)(写业务函 ...

  3. 任务(多线程并行)TFDMemTable内存表传参方式调用服务器返回的TDataSet

    任务(多线程并行)TFDMemTable内存表传参方式调用服务器返回的TDataSet 服务器端: function TServerMethods1.getTFDDataSet   ( const p ...

  4. 小程序入门学习06--data、url传参、调用豆瓣api

    豆瓣不能用了,可以用这个 data- 自定义数据属性 设置 <view class='container movie-card' bindtap='f1' data-user-name=&quo ...

  5. EasyUI框架入门学习

    为什么80%的码农都做不了架构师?>>>    前言 新项目的开发前端技术打算采用EasyUI框架(基于EasyUI较为丰富的UI组件库),项目组长将前端EasyUI这块的任务分配给 ...

  6. 每天一点点之 taro 框架开发 - taro路由及传参

    1.路由 taro的路由是自带的,不需要我们额外配置,只需要我们在app.js下config中配置pages即可 class App extends Component {config = {page ...

  7. MySQL_PHP学习笔记_2015_0614_PHP传参总结_URL传参_表单传参

    1. PHP 传参总结   1.1 url 传参 解析方法(下面两种解读方式均可以): $firstName1 = $_GET['firstName']; $firstName2 = $_REQUES ...

  8. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    %[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...

  9. js调java并传参_Js调用Java方法并互相传参的简单实例

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import ...

最新文章

  1. python装饰器实例-python装饰器实例大详解
  2. 软件体系结构的风格(转载)
  3. Intellij IDEA 使用学习
  4. SAP gateway的307重定向
  5. 高等数学上-赵立军-北京大学出版社-题解-练习5.6
  6. 手机电池的更换标准/指标 最近小米手机换电池那些事
  7. HTML-JS-CSS基础
  8. linux-推荐两款好用的录屏软件
  9. 凸优化第四章凸优化问题 4.2 凸优化
  10. Linux系统封装及配置
  11. RSS阅读器Reeder简单使用攻略
  12. Google在线深度学习神器Colab--实操学习
  13. excel取消隐藏_这个毁人无数的Excel黑洞,却成就一批最牛X的高手
  14. C - Fewest Flops
  15. 【Kaggle】FIFA球员数据可视化分析(一)
  16. 清洗网址中的垃圾字符
  17. linux下删除空行的几种方法
  18. 百度地图多个marker标点+点聚合
  19. JAVASEOUL设计师品牌代购商城计算机毕业设计Mybatis+系统+数据库+调试部署
  20. Fatal: Failed to start mining: etherbase missing: etherbase must be explicitly specified

热门文章

  1. 把家用计算机改成PLC,怎么把电脑当成plc使用
  2. 公司新来一00后,真让人崩溃...
  3. 关于租用香港服务器疑问解答
  4. 区块链招聘现状:平均薪酬16317元,深圳领跑人才需求
  5. Druid数据库连接池就这么简单
  6. ecall函数调用系统函数参数设置教程
  7. 【计算机组成与设计学习笔记】(二)
  8. antd 引入到react里面报错./node_modules/moment/src/lib/locale/locales.js Module not found: Can't resolve './
  9. html页面判断是否相等,javascript怎么判断字符串是否相等?
  10. javascript判断字符串相等