​【Python】Python中好用的命令行参数解析模块

大家好,我是小喵!

关注和星标『AI算法小喵』,和小喵一起学习AI算法!

 👆点击关注|设为星标|干货速递👆


当你想要在终端窗口(ubuntu的终端窗口或windows的命令行窗口)来向程序传入参数并让程序运行时,就需要用到命令行参数解析模块。Python本身提供了三个命令行参数解析模块:getopt、optparse、argparse,三者之中argparse相对更好用。

argparse是python内置的一个用于命令项选项与参数解析的标准模块,不需要安装,上手也容易,本文将通过示例代码介绍argparse的相关用法。

1.argparse四步使用法

argparse的使用可以概括为4步使用法:

  1. 导入模块

  2. 创建解析器

  3. 添加参数

  4. 解析参数

# 1.导入模块
import argparse

def get_parser():
    # 2.创建解析器
    parser = argparse.ArgumentParser()
    # 3.添加参数
    parser.add_argument("--trainData", type=str, default="data/train.json")
    parser.add_argument("--validData", type=str, default="data/dev.json")
    parser.add_argument("--num_epochs", type=int, default=20)
    parser.add_argument("--batch_size", type=int, default=32)
    parser.add_argument("--lr", type=float, default=5e-5)

    parser.add_argument("--freeze_bert", default=False, action="store_true",
                        help="If provided, freeze the layers of bert")
    parser.add_argument("--emb_dropout", default=True,action="store_true",
                        help="If provided, add dropout to the output embedding of bert")
    parser.add_argument("--dropout_rate", type=float, default=0.5)
    parser.add_argument("--num_layers", dest="num_layers", default=1)
    parser.add_argument("--hidden_units", dest="hidden_units", default=128)

    parser.add_argument("--log_dir", type=str, default="logs/")
    parser.add_argument("--model_path", type=str, default="checkpoints/")
    # 4.解析参数
    hp = parser.parse_args()
    return hp

if __name__ == "__main__":
    args = get_parser()
    print(args.__dict__)

2.argparse使用示例

上面已经给出了一个完整的使用示例图,接下来将逐个讲解。(😊这菜上得有点快,我们慢慢吃慢慢消化)

2.0  参数类型与默认值

参数支持各种类型,比如字符串、数值、布尔变量(boolean)等。在添加参数时可以通过type参数指定参数的类型,有效约束命令行中的参数。

另外通过default参数可以指定默认值,如果命令行中未给出参数,则参数取值为默认值。

parser.add_argument("--trainData", type=str, default="data/train.json")
parser.add_argument("--validData", type=str, default="data/dev.json")
parser.add_argument("--num_epochs", type=int, default=20)
parser.add_argument("--batch_size", type=int, default=32)
parser.add_argument("--lr", type=float, default=5e-5)
parser.add_argument("--freeze_bert",type=bool, default=True)

假设我们只添加了上面这几个参数,接着我们执行下面的语句进行几组测试并查看测试结果。可以看到argparse模块对传入的参数进行了校验,类型不符合时会直接抛出错误。当然这里面也涉及到了自动转换参数类型,转换后满足类型约束的也可以正常运行。

  • 默认值

#  python3 train.py   
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 20, 'batch_size': 32, 'lr': 5e-05, 'freeze_bert': True}
  • 修改参数值

#  python3 train.py --lr 0.005       
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 20, 'batch_size': 32, 'lr': 0.005, 'freeze_bert': True}
#  python3 train.py --lr 5       
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 20, 'batch_size': 32, 'lr': 5, 'freeze_bert': True}

# train.py --num_epochs 30  
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 30, 'batch_size': 32, 'lr': 5e-05, 'freeze_bert': True}
# train.py --num_epochs "30"  
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 30, 'batch_size': 32, 'lr': 5e-05, 'freeze_bert': True}

# python3 train.py --num_epochs "三十"
usage: train.py [-h] [--trainData TRAINDATA] [--validData VALIDDATA]
                [--num_epochs NUM_EPOCHS] [--batch_size BATCH_SIZE] [--lr LR]
                [--freeze_bert FREEZE_BERT]
train.py: error: argument --num_epochs: invalid int value: '三十'
# python3 train.py --num_epochs 30.5 
usage: train.py [-h] [--trainData TRAINDATA] [--validData VALIDDATA]
                [--num_epochs NUM_EPOCHS] [--batch_size BATCH_SIZE] [--lr LR]
                [--freeze_bert FREEZE_BERT]
train.py: error: argument --num_epochs: invalid int value: '30.5'

2.1 关于布尔(boolean)类型的参数

单独将布尔类型参数抽离出来讲,是因为argparse在处理布尔类型参数时不能自动转换参数类型。

下面的测试说明无论在命令行中给参数freeze_bert传入什么值,它的值总是为默认值(这里因为解析的参数是作为对象属性存在的,所以可使用print(f"freeze_bert:{args.freeze_bert}")仅看freeze_bert参数的值)。

# python3 train.py --freeze_bert 1    
freeze_bert:True
# python3 train.py --freeze_bert 0
freeze_bert:True

# python3 train.py --freeze_bert False
freeze_bert:True
# python3 train.py --freeze_bert True 
freeze_bert:True

那么想要命令行接收一个能够返回boolean类型值的参数就不可能了吗?

当然不是。本文先例举一个简单的可选方案:使用action参数,对取值为True/False类型的参数,在add_argument方法中加入参数action="store_true"/"store_false"

parser.add_argument("--trainData", type=str, default="data/train.json")
parser.add_argument("--validData", type=str, default="data/dev.json")
parser.add_argument("--num_epochs", type=int, default=20)
parser.add_argument("--batch_size", type=int, default=32)
parser.add_argument("--lr", type=float, default=5e-5)
# parser.add_argument("--freeze_bert",type=bool, default=True)
parser.add_argument("--freeze_bert", default=False, action="store_true",help="If provided, freeze the layers of bert")

如果指定的参数出现,那么action="store_true"/"store_false"起作用,参数值相应地会被存储为True/False。如果不出现,那么参数值为默认值。

# python3 train.py                   
freeze_bert:False
# python3 train.py --freeze_bert     
freeze_bert:True

2.2 参数种类

参数可分为可选参数必需参数

  • 可选参数

除前文例子中双下划线指定外(如:“--freeze_bert”),还可以通过单下划线指定可选参数(如:“-fb”

parser.add_argument("--freeze_bert", "-fb",default=False, action="store_true",help="If provided, freeze the layers of bert")
# python3 train.py              
freeze_bert:False

# python3 train.py -fb          
freeze_bert:True
  • 必需参数

必需参数通过required参数指定。这里我们修改下参数log_dir的指定定方式并进行相关测试。测试结果可见,如果没在命令行中给必需参数赋值,程序会报错。

parser.add_argument("--log_dir", type=str, required=True)
# python3 train.py --log_dir logs/
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 20, 'batch_size': 32, 'lr': 5e-05, 'freeze_bert': False, 'emb_dropout': True, 'dropout_rate': 0.5, 'num_layers': 1, 'hidden_units': 128, 'log_dir': 'logs/', 'model_path': 'checkpoints/'}

# python3 train.py                
usage: train.py [-h] [--trainData TRAINDATA] [--validData VALIDDATA]
                [--num_epochs NUM_EPOCHS] [--batch_size BATCH_SIZE] [--lr LR]
                [--freeze_bert] [--emb_dropout] [--dropout_rate DROPOUT_RATE]
                [--num_layers NUM_LAYERS] [--hidden_units HIDDEN_UNITS]
                --log_dir LOG_DIR [--model_path MODEL_PATH]
train.py: error: the following arguments are required: --log_dir

2.3 可选值

除设定参数类型、修改参数值、要求参数为必需参数或可选参数外,我们还可以约束参数的可取值。这里choices参数可以将参数限制为给定列表。

我们增加一个参数,

parser.add_argument("--pretrained_path","-prep", type=str,choices=["bert-base-chinese","bert-base-uncased","bert-large-uncased"])

然后进行下面的测试:

#  python3 train.py -prep bert-base-chinese --log_dir logs/
{'trainData': 'data/train.json', 'validData': 'data/dev.json', 'num_epochs': 20, 'batch_size': 32, 'lr': 5e-05, 'freeze_bert': False, 'emb_dropout': True, 'dropout_rate': 0.5, 'num_layers': 1, 'hidden_units': 128, 'log_dir': 'logs/', 'model_path': 'checkpoints/', 'pretrained_path': 'bert-base-chinese'}

# python3 train.py -prep bert-base-cased --log_dir logs/
usage: train.py [-h] [--trainData TRAINDATA] [--validData VALIDDATA]
                [--num_epochs NUM_EPOCHS] [--batch_size BATCH_SIZE] [--lr LR]
                [--freeze_bert] [--emb_dropout] [--dropout_rate DROPOUT_RATE]
                [--num_layers NUM_LAYERS] [--hidden_units HIDDEN_UNITS]
                --log_dir LOG_DIR [--model_path MODEL_PATH]
                [--pretrained_path {bert-base-chinese,bert-base-uncased,bert-large-uncased}]
train.py: error: argument --pretrained_path/-prep: invalid choice: 'bert-base-cased' (choose from 'bert-base-chinese', 'bert-base-uncased', 'bert-large-uncased')

3.总结

argparse模块还有其他一些使用示例,比如目标互斥参数追加操作等等,后续篇章我们再来介绍。

 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

dc8cf0609be491d24b59999f89308e36.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值