python argparse使用及常用环境

简介

argparse是python中用来方便获取命令行参数的模块,也可以很方便的做一个简单的命令行参数的设定,例如 ls -h 等后面加参数的情况,可以自己创建一个支持命令行参数的命令。

基本使用

示例如下:

import argparse

parser = argparse.ArgumentParser()
# 位置参数, 必须要传入的参数, 默认情况下接收到args.echo接收到的是字符串
# 当需要对接收到的字符串做类型转换时,可以使用type参数来指定接收到参数类型
# parser.add_argument("echo", help="show what you need", type=int)
# 可选参数,可以指定相关参数,例如,此处为--verbosity test
parser.add_argument("--verbosity", help="increase output verbosity")
# 可选参数,可以设置当参数出现时或者不出现时对于参数的值,使用action="store_true"
parser.add_argument("--verbose", help="increase output verbosity", action="store_true")
# 可以设置短命令或者长命令
parser.add_argument("--default", "-d", help="set default", action="store_true")
# 可以设置命令的可选值, 当出现choices时,无法与位置参数共同使用
parser.add_argument("--choose", "-c", choices=[1, 2, 3], type=int)
# 可选参数设置默认值default=0
parser.add_argument("--fault", "-f", default=0, help="show help")
args = parser.parse_args()
# print(args.echo)
print(args.verbosity)
print(args.verbose)
print(args.default)
print(args.choose)
print(args.fault)

上述均是通过捕捉命令行方式获取对应的命令行参数的值,当获取到值后可以进行相关的操作。

多级命令的生成

使用add_subparsers方法,add_subparsers方法返回的也是一个parser对象,添加子命令只需基于返回的parser对象添加参数或者继续添加子命令等,正常来说达到两级的子命令就足够了,例如ros2 pkg create,pkg create是它的子级命令,后面携带的便是参数。

class MutableString:
    def __init__(self):
        self.value = ''

    def __getattr__(self, name):
        print(f"__getattr__:{name}")
        return getattr(self.value, name)

    def __iter__(self):
        print("__iter__")
        return self.value.__iter__()


if __name__ == "__main__":
    import argparse

    cli_name = ""
    description = f'{cli_name} is an extensible command-line tool for .'
    # RawDescriptionHelpFormatter:帮助消息格式化程序,就是展示字符原来的状态,例如换行
    parser = argparse.ArgumentParser(
        description=description,
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    parser.add_argument(
        '--buffering',
        action='store_true',
        default=False,
        help=('add buffering'),
    )
    mutu_description = MutableString()
    print(id(mutu_description))
    subparsers = parser.add_subparsers(
        title="Commands",
        description=mutu_description,
        metavar=f'\nCall `{cli_name} <command> -h` for more detailed usage.',
    )
    subparsers.dest = "command"
    subparsers.required = False
    test_command = subparsers.add_parser(
        name="test",
        description="test some  program",
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    test_command.add_argument("-x", type=int, help="-x help")
    test_command.add_argument("-y", type=int, help="-y help")
    mutu_description.value = "test   test some  program\n"
    run_command = subparsers.add_parser(
        name="run",
        description="run some  program",
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    mutu_description.value = mutu_description.value + "run   run some  program\n"
    run_command_parser = run_command.add_subparsers(
        title="Commands",
        description="create    create some  program\n",
        metavar='\nCall `run <command> -h` for more detailed usage.',
    )
    run_command_2 = run_command_parser.add_parser(
        name="create",
        description="create some  program",
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    run_command_2.add_argument("-a", type=int, help="-a help")
    run_command_2.add_argument("-b", type=int, help="-b help")
    args = parser.parse_args()

上述整体流程基于parser对象使用add_subparsers创建子级命令对象,子级命令对象添加参数等,需要注意的是其中的子级命令的父级命令的描述的汇总使用了一个叫MutableString的对象,此对象类似于str,但是当其值发生变化时,内存地址不会发生变化,可用于在添加子级命令过程中获取并添加描述。

argparser中的主要方法及含义

add_argument

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • name:需要添加的命令行参数,可以有简写和全写,类似于create,--create,-c
  • action:
  • nargs:
  • const:
  • default:命令的参数默认值。
  • type:命令参数的类型,例如int、float、str、bool等,注意是接收到命令行参数转换后的类型,默认情况下命令行参数在输入时都是str(字符串)类型。
  • choices:命令参数的可选参数,例如列表集合显示,["apple", "huawei", "mi"]
  • required:命令行参数是否被强制需要。
  • help:命令行的帮助,会显示在-h中
  • metavar:帮助信息中的命令行后面的参数,例如--create CREATE,metavar就是CREATE,默认情况下为命令的字符全大写,此参数也会影响parse_args解析的参数的名称,当修改metavar名称为cre时,解析的args中就会出现cre参数,而不会显示create
  • dest:与metvar功能类似,可以修改帮助信息的命令后面的参数,不过设置时默认是大写,即使dest是小写,也会影响到parser_args的结果,args的参数名称是dest设置的名称。

当同时出现metavardest时,会出现,帮助信息的命令行后面的参数是metavar,parse_args解析的参数名称则使用的是dest的名称。所以说metavar主要是用来控制帮助信息的,dest用来控制parse_args的解析出来的参数的。

add_subparsers

ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_strings][, dest][, required][, help][, metavar])¶
  • title: 子命令的名称
  • description:子命令的描述
  • prog:命令的用法信息,就是

打包成可执行程序

当创建完命令行参数的可执行程序后,想要它不使用python .py的方式,直接使用.exe的方式执行时,就需要使用到pyinsatller进行打包,打包完之后就可以直接使用exe文件。

posted @ 2022-09-29 16:05  形同陌路love  阅读(190)  评论(0编辑  收藏  举报