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设置的名称。
当同时出现metavar
和dest
时,会出现,帮助信息的命令行后面的参数是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文件。