Pythonargparse教程展示了如何使用argparse模块在Python中解析命令行参数。
Python参数解析
argparse
模块使编写用户友好的命令行界面变得容易。它从sys.argv
解析定义的参数。
argparse
模块还会自动生成帮助和用法消息,并在用户为程序提供无效参数时发出错误消息。
argparse
是一个标准模块;我们不需要安装它。
使用ArgumentParser
创建解析器,并使用add_argument
添加新参数。参数可以是可选的、必需的或位置的。
Pythonargparse可选参数
以下示例创建了一个简单的参数解析器。
#!/usr/bin/python import argparse # help flag provides flag help # store_true actions stores argument as True parser = argparse.ArgumentParser() parser.add_argument('-o', '--output', action='store_true', help="shows output") args = parser.parse_args() if args.output: print("This is some output")
该示例添加了一个具有两个选项的参数:一个短的-o
和一个长的--ouput
。这些是可选参数。
import argparse
模块已导入。
parser.add_argument('-o', '--output', action='store_true', help="shows output")
使用add_argument
添加参数。action
设置为store_true
会将参数存储为True
(如果存在)。帮助选项提供参数帮助。
args = parser.parse_args()
参数使用parse_args
进行解析。解析的参数作为对象属性存在。在我们的例子中,会有args.output
属性。
if args.output: print("This is some output")
如果参数存在,我们会显示一些输出。
$ optional_arg.py -o This is some output $ optional_arg.py --output This is some output
我们使用-o
和--output
运行程序。
$ optional_arg.py --help usage: optional_arg.py [-h] [-o] optional arguments: -h, --help show this help message and exit -o, --output shows output
我们可以显示程序帮助。
Pythonargparse所需参数
required
选项使参数成为必需。
#!/usr/bin/python import argparse # required arg parser = argparse.ArgumentParser() parser.add_argument('--name', required=True) args = parser.parse_args() print(f'Hello {args.name}')
示例必须指定name
选项;否则失败。
$ required_arg.py --name Peter Hello Peter $ required_arg.py usage: required_arg.py [-h] --name NAME required_arg.py: error: the following arguments are required: --name
Pythonargparse位置参数
以下示例使用位置参数。它们是使用add_argument
创建的。
#!/usr/bin/python import argparse # positional args parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('age') args = parser.parse_args() print(f'{args.name} is {args.age} years old')
该示例需要两个位置参数:姓名和年龄。
parser.add_argument('name') parser.add_argument('age')
位置参数是在没有破折号前缀字符的情况下创建的。
$ positional_arg.py Peter 23 Peter is 23 years old
Python参数解析目标
add_argument
的dest
选项给出参数的名称。如果未给出,则从选项中推断。
#!/usr/bin/python import argparse import datetime # dest gives a different name to a flag parser = argparse.ArgumentParser() parser.add_argument('-n', dest='now', action='store_true', help="shows now") args = parser.parse_args() # we can refer to the flag # by a new name if args.now: now = datetime.datetime.now() print(f"Now: {now}")
程序将now
名称赋予-n
参数。
$ ./dest.py -n Now: 2022-08-20 09:42:32.195881
Pythonargparse类型
type
参数确定参数类型。
#!/usr/bin/python import argparse import random # type determines the type of the argument parser = argparse.ArgumentParser() parser.add_argument('-n', type=int, required=True, help="define the number of random integers") args = parser.parse_args() n = args.n for i in range(n): print(random.randint(-100, 100))
程序显示n个从-100到100的随机整数。
parser.add_argument('-n', type=int, required=True, help="define the number of random integers")
-n
选项需要整数值,这是必需的。
$ rand_int.py -n 3 92 -61 -61
Pythonargparse默认值
如果未给出值,default
选项指定默认值。
#!/usr/bin/python import argparse # required defines a mandatory argument # default defines a default value if not specified parser = argparse.ArgumentParser() parser.add_argument('-b', type=int, required=True, help="defines the base value") parser.add_argument('-e', type=int, default=2, help="defines the exponent value") args = parser.parse_args() val = 1 base = args.b exp = args.e for i in range(exp): val *= base print(val)
该示例计算幂。不需要指数值;如果没有给出,默认值为2。
$ power.py -b 3 9 $ power.py -b 3 -e 3 27
Pythonargparse元变量
metavar
选项为错误和帮助输出中的预期值命名。
#!/usr/bin/python import argparse # metavar gives name to the expected value # in error and help outputs parser = argparse.ArgumentParser() parser.add_argument('-v', type=int, required=True, metavar='value', help="computes cube for the given value") args = parser.parse_args() print(args) val = args.v print(val * val * val)
该示例将期望值命名为value
。默认名称是V
。
$ metavar.py -h usage: metavar.py [-h] -v value optional arguments: -h, --help show this help message and exit -v value computes cube for the given value
帮助输出中显示了给定的名称。
Pythonargparse附加操作
append
操作允许对重复选项进行分组。
#!/usr/bin/python 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}!')
该示例向使用n
或name
选项指定的所有名称生成问候消息;它们可以重复多次。
$ appending.py -n Peter -n Lucy --name Jane Hello Peter! Hello Lucy! Hello Jane!
Pythonargparsenargs
nargs
指定了应该使用的命令行参数的数量。
#!/usr/bin/python import argparse import sys # nargs sets the required number of argument values # metavar gives name to argument values in error and help output parser = argparse.ArgumentParser() parser.add_argument('chars', type=str, nargs=2, metavar='c', help='starting and ending character') args = parser.parse_args() try: v1 = ord(args.chars[0]) v2 = ord(args.chars[1]) except TypeError as e: print('Error: arguments must be characters') parser.print_help() sys.exit(1) if v1 > v2: print('first letter must precede the second in alphabet') parser.print_help() sys.exit(1)
该示例显示了从第一个字符到第二个字符的一系列字符。它需要两个参数。
parser.add_argument('chars', type=str, nargs=2, metavar='c', help='starting and ending character')
使用nargs=2
我们指定我们需要两个参数。
$ charseq.py e k e f g h i j k
程序显示从e到k的字符序列。
可以使用*
字符设置可变数量的参数。
#!/usr/bin/python import argparse # * nargs expects 0 or more arguments parser = argparse.ArgumentParser() parser.add_argument('num', type=int, nargs='*') args = parser.parse_args() print(f"The sum of values is {sum(args.num)}")
该示例计算值的总和;我们可以为程序指定可变数量的参数。
$ var_args.py 1 2 3 4 5 The sum of values is 15
Pythonargparse选择
choices
选项将参数限制为给定列表。
#!/usr/bin/python import argparse import datetime import time # choices limits argument values to the # given list parser = argparse.ArgumentParser() parser.add_argument('--now', dest='format', choices=['std', 'iso', 'unix', 'tz'], help="shows datetime in given format") args = parser.parse_args() fmt = args.format if fmt == 'std': print(datetime.date.today()) elif fmt == 'iso': print(datetime.datetime.now().isoformat()) elif fmt == 'unix': print(time.time()) elif fmt == 'tz': print(datetime.datetime.now(datetime.timezone.utc))
在示例中,now
选项可以接受以下值:std
、iso
、unix
、或tz
。
$ ./mytime.py --now iso 2022-08-20T09:44:22.437880 $ ./mytime.py --now unix 1660981466.8261166
头部示例
以下示例模拟了Linuxhead命令。它显示从文件开头开始的n行文本。
sky top forest wood lake wood
例如,我们有这个小测试文件。
#!/usr/bin/python import argparse from pathlib import Path # head command # working with positional arguments parser = argparse.ArgumentParser() parser.add_argument('f', type=str, help='file name') parser.add_argument('n', type=int, help='show n lines from the top') args = parser.parse_args() filename = args.f lines = Path(filename).read_text().splitlines() for line in lines[:args.n]: print(line)
该示例有两个选项:f
用于文件名,-n
用于显示行数。
$ head.py words.txt 3 sky top forest
在本教程中,我们使用了Pythonargparse模块。
列出所有Python教程。