Python 里处理命令行参数有多种方法,其中最推荐的是使用 argparse
模块。argparse
是 Python 标准库的一部分,用于解析命令行参数并生成帮助和使用信息。虽然 Python 还提供了另外两个模块 getopt
和 optparse
,官方推荐优先使用 argparse
。
为什么推荐 argparse
- 简单易用:通过几行代码就可以解析命令行参数。
- 功能强大:支持位置参数和可选参数,并自动生成帮助信息。
- 灵活性高:可以处理复杂的命令行参数需求。
其他可选模块
getopt
:类似于 C 语言中的getopt()
,适合熟悉 C 语言风格的。optparse
:已被弃用,不推荐在新项目中使用。
基本用法
让我们从一个简单的例子开始。
import argparse
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser()
# 添加一个位置参数 "echo"
parser.add_argument("echo", help="The string to be echoed")
# 解析命令行参数
args = parser.parse_args()
# 打印解析后的参数值
print(args.echo)
运行此程序
假设这个脚本名为 prog.py
,在命令行中执行以下操作:
$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
上面的错误提示我们需要提供一个 echo
参数。可以查看帮助信息:
$ python prog.py --help
这将显示:
usage: prog.py [-h] echo
positional arguments:
echo The string to be echoed
options:
-h, --help show this help message and exit
然后,即可正确地运行程序:
$ python prog.py foo
foo
使用可选参数
在上面的例子中,我们只使用了一个位置参数。argparse
也支持可选参数,这些参数通常以 -
或 --
开头。
import argparse
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser()
# 添加一个位置参数 "echo"
parser.add_argument("echo", help="The string to be echoed")
# 添加一个可选参数 "verbose"
parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity")
# 解析命令行参数
args = parser.parse_args()
# 打印解析后的参数值
print(f'echo: {args.echo}')
if args.verbose:
print("Verbosity turned on")
运行此程序
$ python prog.py foo
echo: foo
$ python prog.py foo -v
echo: foo
Verbosity turned on
$ python prog.py foo --verbose
echo: foo
Verbosity turned on
处理有歧义的参数
在命令行参数较多时,可能会遇到参数名冲突或歧义问题。argparse
提供了丰富的选项来处理这些情况。
示例:指定参数类型和默认值
import argparse
parser = argparse.ArgumentParser()
# 位置参数 "number",指定为整数类型
parser.add_argument("number", type=int, help="an integer for the accumulator")
# 可选参数 "accumulate",使用 store_const 存储常量值
parser.add_argument("--sum", dest="accumulate", action="store_const", const=sum, default=max, help="sum the integers (default: find the max)")
args = parser.parse_args()
# 根据 accumulate 的值调用 sum 或 max 函数
if args.accumulate is sum:
print(sum([args.number]))
else:
print(max([args.number]))
运行此程序
$ python prog.py 10
[10]
$ python prog.py 10 --sum
30
示例代码中的 accumulate
应该是一个函数,这里假设 sum
和 max
已经以某种方式被定义为可接受单个参数的函数。