import argparse命令行选项、参数解析器使用

写在前面

argparse 模块可以让人轻松编写用户友好的命令行接口。

  • 它可以帮助程序定义它需要的参数
  • 帮助程序如何从 sys.argv 解析出那些参数
  • 还可以自动生成帮助和使用手册
  • 在用户给程序传入无效参数时报出错误信息

如何使用

1. 创建一个argparse解析器

ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息

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, exit_on_error=True)

## 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)
## exit_on_error - 决定当错误发生时是否让 ArgumentParser 附带错误信息退出。 (默认值: True)
parser = argparse.ArgumentParser(description='add argument description')

2. 添加参数信息 add_argument()

add_argument() 方法可以给一个 ArgumentParser 对象添加程序参数信息

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


## name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
parser.add_argument('foo')
parser.add_argument('-f', '--foo')
## action - 当参数在命令行中出现时使用的动作基本类型,默认是store,即存储参数的值。
parser.add_argument('--foo', action='store_const', const=42) ##默认 foo=42
parser.add_argument('--enable_a', action='store_true') #加 --enable_a 则值为True, 不加的话,这个值是false
parser.add_argument('--enable_b', action='store_false')#加 --enable_b 则值为false, 不加的话,这个值是True
## default - 当参数未在命令行中出现时使用的值。
parser.add_argument("--cache_dir_root", default="/home/.cache")

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

## type - 命令行参数应当被转换成的类型,默认情况下对象将命令行参数当作简单字符串读入,可以根据需求指定int float等
parser.add_argument('foo', type=int)
parser.add_argument('bar', type=open) ##比如从 temp.txt文件读入


choices - 可用的参数的容器。
## required - 此命令行选项是否可省略,(默认认为参数在命令行中是可以被忽略的,如果required=True就是必须指定的参数)
parser.add_argument('--foo', required=True)

help - 一个此选项作用的简单描述。
parser.add_argument('bar', type=int, default=42, help='the bar to %(prog)s (default: %(default)s)')

metavar - 在使用方法消息中使用的参数值示例。
dest - 被添加到 parse_args() 所返回对象上的属性名。
parser.add_argument('-f', '--foo')
parser.add_argument("--cache_dir_root", default="/home/.cache")
parser.add_argument('--foo', action='store_const', const=42) ##默认 foo=42
parser.add_argument('--enable_a', action='store_true') # 默认enable_a = true

3. 参数解析与使用 parse_args()

ArgumentParser 通过 parse_args() 方法解析参数。它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。

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

## args - 要解析的字符串列表。 默认值是从 sys.argv 获取。
## namespace - 用于获取属性的对象。 默认值是一个新的空 Namespace 对象。

但是在解析命令行时,parse_args() 会检测多种错误,包括有歧义的选项、无效的类型、无效的选项、错误的位置参数个数等等。 当遇到这种错误时,它将退出并打印出错误文本同时附带用法消息。

在这种情况下,parse_known_args() 方法会很有用处。只解析部分的命令行参数, 它的作用方式很类似 parse_args() 但区别在于当存在额外参数时它不会产生错误。 而是会返回一个由两个条目构成的元组,其中包含带成员的命名空间和剩余参数字符串的列表。

args = parser.parse_args()
args, unknown = parser.parse_known_args()

使用示例

#!/usr/bin/env python3
# coding=utf-8

import argparse

def prase_args():
    parser = argparse.ArgumentParser("test argparse")

    parser.add_argument("--input_file", required=True, help="input file path")
    parser.add_argument("--test_bool_a", action='store_true')
    parser.add_argument("--test_bool_b", action='store_false')
    parser.add_argument("--test_int", type=int, default=63)

    args, unknown = parser.parse_known_args()
    bypass_args = ' '.join(unknown)
    return args,bypass_args

def main():
    args,bypass_args = prase_args()

    print("test_bool_a: {}" .format(args.test_bool_a))
    print("test_bool_b: {}" .format(args.test_bool_b))
    print("test_int: {}" .format(args.test_int))
    print(bypass_args)

if __name__ == "__main__":
    main()

python3 test.py -h                   
usage: test argparse [-h] --input_file INPUT_FILE [--test_bool_a]
                     [--test_bool_b] [--test_int TEST_INT]

optional arguments:
  -h, --help            show this help message and exit
  --input_file INPUT_FILE
                        input file path
  --test_bool_a
  --test_bool_b
  --test_int TEST_INT

------------------------------------------------------------------------------
python3 test.py --input_file=test.txt
test_bool_a: False
test_bool_b: True
test_int: 63

------------------------------------------------------------------------------
python3 test.py --input_file=test.txt --test_bool_a
test_bool_a: True
test_bool_b: True
test_int: 63


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一銤阳光

希望分享的内容对你有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值