子命令与选项
构建复杂的 CLI
子命令与选项 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
为什么使用子命令?
像 git这样的工具拥有子命令:git add、git commit。argparse 通过子解析器支持这一功能,每个子命令都可以拥有自己的参数。
import argparse
parser = argparse.ArgumentParser(prog='tool')
sub = parser.add_subparsers(dest='command')
print('subparsers ready')添加子解析器
add_subparsers会返回一个对象,该对象的 add_parser方法用于创建各个子命令。dest用于保存用户选择的子命令。
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
sub.add_parser('start')
sub.add_parser('stop')
args = parser.parse_args(['start'])
print('command:', args.command)为各个子命令设置参数
每个子解析器都可以定义自己的参数。这里的 add子命令接收一个名称,而 list不接收任何参数。
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
p_add = sub.add_parser('add')
p_add.add_argument('name')
sub.add_parser('list')
args = parser.parse_args(['add', 'milk'])
print(args.command, args.name)根据命令进行分派
解析完成后,根据 args.command分支执行相应的逻辑。
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
p_add = sub.add_parser('add')
p_add.add_argument('item')
sub.add_parser('clear')
args = parser.parse_args(['add', 'eggs'])
if args.command == 'add':
print('adding', args.item)
elif args.command == 'clear':
print('clearing all')使用 set_defaults 设置处理函数
一种简洁的模式是使用 set_defaults(func=...)为每个子解析器绑定一个函数,然后调用 args.func(args)。
import argparse
def do_hi(args):
print('hi', args.who)
parser = argparse.ArgumentParser()
sub = parser.add_subparsers()
p = sub.add_parser('hi')
p.add_argument('who')
p.set_defaults(func=do_hi)
args = parser.parse_args(['hi', 'Ana'])
args.func(args)通过父解析器共享选项
父解析器用于保存多个子命令共有的选项,从而避免重复。请传入 parents=[base]和 add_help=False。
import argparse
base = argparse.ArgumentParser(add_help=False)
base.add_argument('--verbose', action='store_true')
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd')
sub.add_parser('run', parents=[base])
args = parser.parse_args(['run', '--verbose'])
print(args.cmd, args.verbose)为每个选项设置默认值
子命令的选项可以拥有自己的默认值和类型,就像顶层参数一样。
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd')
p = sub.add_parser('scale')
p.add_argument('--factor', type=float, default=1.0)
args = parser.parse_args(['scale'])
print('factor:', args.factor)追加重复的选项
action='append'允许多次提供同一个标志,并将每个值收集到列表中。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--tag', action='append', default=[])
args = parser.parse_args(['--tag', 'a', '--tag', 'b'])
print(args.tag)统计标志出现次数
action='count'会统计某个标志出现的次数,这是经典的 -vvv详细程度模式。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', action='count', default=0)
args = parser.parse_args(['-v', '-v', '-v'])
print('verbosity level:', args.v)一个包含两个命令的工具
将子命令、处理函数和共享选项组合起来,就能得到一个结构清晰的多命令 CLI。
import argparse
def add(args):
print('add', args.item, 'qty', args.qty)
def remove(args):
print('remove', args.item)
parser = argparse.ArgumentParser()
sub = parser.add_subparsers()
pa = sub.add_parser('add')
pa.add_argument('item')
pa.add_argument('--qty', type=int, default=1)
pa.set_defaults(func=add)
pr = sub.add_parser('remove')
pr.add_argument('item')
pr.set_defaults(func=remove)
args = parser.parse_args(['add', 'pen', '--qty', '3'])
args.func(args)必需的子命令
在子解析器上设置 required=True,这样用户就必须选择一个命令,否则 argparse 会报错。
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd', required=True)
sub.add_parser('go')
args = parser.parse_args(['go'])
print('chosen:', args.cmd)快速检查
测试您对子命令和选项的理解。
回顾
您学会了子命令和选项:
add_subparsers和add_parser用于构建多命令工具。set_defaults(func=...)用于将请求分派给处理函数。- 父解析器可以共享通用选项。
append和count操作用于处理重复的标志。
下一步:使用 Click 库构建基于装饰器的 CLI。
常见问题解答
「子命令与选项」课时是免费的吗?
是的 — 「子命令与选项」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「子命令与选项」这节课中我会学到什么?
构建复杂的 CLI 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「子命令与选项」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。