【python编程】命令行选项参数和子命令解析器argparse

optparse

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

含义:

  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo
  • choices: 可选参数范围
  • required: 是否一定要设置该选项
    • required=True
    • required=False
  • type: 指定参数类型,默认str
    • type=int/float/bool: 整数/浮点数/逻辑型
    • type=open
    • type=limit
  • nargs: 选项后参数个数
    • nargs=3: 要求3个参数
    • nargs="*": 允许0或多个参数
    • nargs="?": 要求0或1个参数
    • nargs="+": 要求至少1个参数
  • const: 指定了选项,但没指定参数时,取const设定的值,而不取default的值。在nargs="?"或action="store_const"时有用。
  • action: 接收命令行参数后如何处理
    • action="store": 保存参数值,默认
    • action="store_const": 设定选项后,将参数的值解析为const的值
    • action="store_true": 设定选项后,将参数值自动解析为True
    • action="store_false": 设定选项后,将参数值自动解析为False
    • action="append": 存储为一个列表,多次使用一个选项时使用
    • action="append_const": 存储为一个列表,将const的值追加到列表
    • action="count": 统计一个选项出现的次数
  • dest:解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
  • matavar:在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
  • parser.parse_args(): 解析
  • parser.print_help(): 打印描述信息

接收命令参数如何处理:action

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', action='store_true', help="shows output")
args = parser.parse_args()

print(args.output)

输出:

[root@node01 python]# python3 demo01.py
False
[root@node01 python]# python3 demo01.py -o
True

 

import argparse

# append action allows to group repeating
# options

parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', dest='names', action='append', help="provides names to greet")

args = parser.parse_args()
names = args.names

for name in names:
    print(f'Hello {name}!')

 

输出:

$ appending.py -n Peter -n Lucy --name Jane
Hello Peter!
Hello Lucy!
Hello Jane!

该示例生成问候语,并使用nname选项指定所有名称。 它们可以重复多次重复。

 

import math
import argparse

def parse_args():
    parse = argparse.ArgumentParser(description='Calculate cylinder volume')
    parse.add_argument('-n', '--num', type=int, nargs='+', metavar='', required=True, help='a string of nums')
    args = parse.parse_args()
    return args

if __name__ == '__main__':
    args = parse_args()
    print(args.num)
    for i in list(args.num):
        print(i)

输出:

[root@node01 python]# python3 demo01.py -n  1 3 5 7 9
[1, 3, 5, 7, 9]
1
3
5
7
9

 

可选参数范围:choice

choices:限定参数值范围(规定只接收规定列表中的值),值为列表。例:choices=[1,2,3] 。

例如:

import argparse

parser = argparse.ArgumentParser(description = "help !")
parser.add_argument("-n", type=int, help="输出数量!", choices=[1,2,3], default=2)
parser.add_argument("-v", type=int, help="输出版本!", choices=[7,8,9], default=8)
args = parser.parse_args()
print(args.v, args.n)

输出:

[root@node01 python]# python3 demo01.py -n 3 -v 1
usage: demo01.py [-h] [-n {1,2,3}] [-v {7,8,9}]
demo01.py: error: argument -v: invalid choice: 1 (choose from 7, 8, 9)
[root@node01 python]# python3 demo01.py -n 3 -v 8
8 3

 

 

import math
import argparse  # 1、导入argpase包

def parse_args():
    parse = argparse.ArgumentParser(description='Calculate cylinder volume')  # 2、创建参数对象
    parse.add_argument('-r', '--radius', default=2, type=int, help='Radius of Cylinder')  # 3、往参数对象添加参数
    parse.add_argument('-H', '--height', default=4, type=int, help='height of Cylinder')
    args = parse.parse_args()  # 4、解析参数对象获得解析对象
    return args

def cal_vol(radius, height):
    vol = math.pi * pow(radius, 2) * height
    return vol

if __name__ == '__main__':
    args = parse_args()
    print(cal_vol(args.radius, args.height))  # 5、使用解析对象.参数获取使用命令行参数

输出:

[root@node01 python]# python3 demo01.py -h
usage: demo01.py [-h] [-r RADIUS] [-H HEIGHT]

Calculate cylinder volume

optional arguments:
  -h, --help            show this help message and exit
  -r RADIUS, --radius RADIUS
                        Radius of Cylinder
  -H HEIGHT, --height HEIGHT
                        height of Cylinder

 

metavarargparse 中用于控制帮助文档中参数名显示的选项。以下是一个简单的示例,展示如何使用 argparsemetavar 参数:

import argparse

# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description="这是一个示例程序")

# 添加参数并设置 metavar
parser.add_argument('--name', type=str, metavar='USERNAME', help='输入您的用户名')
parser.add_argument('--age', type=int, metavar='AGE', help='输入您的年龄')

# 解析命令行参数
args = parser.parse_args()

# 打印解析结果
print(f"用户名: {args.name}")
print(f"年龄: {args.age}")

在这个示例中,--name--age 参数都有一个 metavar 参数。metavar 定义了在帮助信息中如何展示这些参数:

  • metavar='USERNAME' 意味着在帮助信息中,--name 参数会显示为 USERNAME
  • metavar='AGE' 意味着在帮助信息中,--age 参数会显示为 AGE

如果你运行 python script.py --help,输出的帮助信息将会类似于这样:

usage: script.py [-h] [--name USERNAME] [--age AGE]

这是一个示例程序

optional arguments:
  -h, --help       show this help message and exit
  --name USERNAME  输入您的用户名
  --age AGE        输入您的年龄
import math
import argparse  # 1、导入argpase包


def parse_args():
    parse = argparse.ArgumentParser(description='Calculate cylinder volume')  # 2、创建参数对象
    parse.add_argument('-r', '--radius', default=2, type=int, metavar='', help='Radius of Cylinder')  # 3、往参数对象添加参数
    parse.add_argument('-H', '--height', default=4, type=int, metavar='height', help='height of Cylinder')
    args = parse.parse_args()  # 4、解析参数对象获得解析对象
    return args


def cal_vol(radius, height):
    vol = math.pi * pow(radius, 2) * height
    return vol


if __name__ == '__main__':
    args = parse_args()
    print(cal_vol(args.radius, args.height))  # 5、使用解析对象.参数获取使用命令行参数

输出:

[root@node01 python]# python3 demo01.py -h
usage: demo01.py [-h] [-r] [-H height]

Calculate cylinder volume

optional arguments:
  -h, --help            show this help message and exit
  -r , --radius         Radius of Cylinder
  -H height, --height height
                        height of Cylinder

解析后的参数名称:dest

add_argument()dest选项为参数指定名称。 如果未给出,则从选项中推断出来。

import argparse
import datetime

parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', dest='now', action='store_true', help="shows now")
args = parser.parse_args()

if args.now:

    now = datetime.datetime.now()
    print(f"Now: {now}")

输出:

[root@node01 python]# python3 demo01.py -n 
Now: 2023-07-24 10:34:18.524103

 

import argparse

def main():
    parser = argparse.ArgumentParser(description="示例:两个选项互斥")

    # 创建互斥组
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--option1', action='store_true', help='选项 1')
    group.add_argument('--option2', action='store_true', help='选项 2')

    args = parser.parse_args()

    if args.option1:
        print("选项 1 被选择")
    if args.option2:
        print("选项 2 被选择")

if __name__ == "__main__":
    main()

参考资料

1. argparse模块使用教程

2. argparse --- 命令行选项、参数和子命令解析器

 

posted @ 2023-07-06 11:47  苏格拉底的落泪  阅读(75)  评论(0编辑  收藏  举报