0Pricing
Python Academy · 课时

子命令与选项

构建复杂的 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. argparse 基础
  2. 子命令与选项
  3. Click 库
  4. 丰富的终端输出
← 返回 Python Academy