如何有条件地使 python 的 argparse 模块需要额外的参数
How to conditionally make python's argparse module require additional arguments
基本预期用途:
my_framework create Project_title /path/to/project
或
my_framework create Project_title
(即使用当前工作目录)
或
my_framework update
(即更新 my_framework 而不是创建新项目)
我知道我可以通过提供默认值使 name
成为可选的,但实际上 name
是 而不是 可选的,前提是用户已经输入create
作为第一个参数。
我想到的最佳解决方案是为 name
使用默认值,然后,如果参数 name
等于其默认值,则抛出错误。但是,如果有办法让 argparse 为我完成这项工作,我宁愿学习这样做。
写两个脚本,my_framework_create
和 my_framework_update
在美学上对我没有吸引力。
#!/usr/bin/env python
import argparse
import os
import shutil
from subprocess import call
template_path = "/usr/local/klibs/template"
parser = argparse.ArgumentParser("MY_FRAMEWORK CLI", description='Creates a new MY_FRAMEWORK project or updates MY_FRAMEWORK')
parser.add_argument('action', choices=['create', 'update'], type=str, help='<help text>')
parser.add_argument('name', type=str, help='<help text>')
parser.add_argument('path', default=os.getcwd(), nargs="?", type=str, help='<help text>')
args = parser.parse_args()
if args.action == "create":
# do the create stuff
if args.action == "update":
# do the update stuff
最好的方法是使用 subparser
文档中的示例:
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
... description='valid subcommands',
... help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage: [-h] {foo,bar} ...
optional arguments:
-h, --help show this help message and exit
subcommands:
valid subcommands
{foo,bar} additional help
在您的情况下,您会将 create
和 update
作为单独的子解析器。
示例:
def create(args):
# do the create stuff
print(args)
def update(args):
# do the update stuff
print(args)
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands',
description='valid subcommands',
help='additional help')
create_parser = subparsers.add_parser('create')
create_parser.add_argument('name', type=str)
create_parser.set_defaults(func=create)
update_parser = subparsers.add_parser('update')
update_parser.set_defaults(func=update)
基本预期用途:
my_framework create Project_title /path/to/project
或
my_framework create Project_title
(即使用当前工作目录)
或
my_framework update
(即更新 my_framework 而不是创建新项目)
我知道我可以通过提供默认值使 name
成为可选的,但实际上 name
是 而不是 可选的,前提是用户已经输入create
作为第一个参数。
我想到的最佳解决方案是为 name
使用默认值,然后,如果参数 name
等于其默认值,则抛出错误。但是,如果有办法让 argparse 为我完成这项工作,我宁愿学习这样做。
写两个脚本,my_framework_create
和 my_framework_update
在美学上对我没有吸引力。
#!/usr/bin/env python
import argparse
import os
import shutil
from subprocess import call
template_path = "/usr/local/klibs/template"
parser = argparse.ArgumentParser("MY_FRAMEWORK CLI", description='Creates a new MY_FRAMEWORK project or updates MY_FRAMEWORK')
parser.add_argument('action', choices=['create', 'update'], type=str, help='<help text>')
parser.add_argument('name', type=str, help='<help text>')
parser.add_argument('path', default=os.getcwd(), nargs="?", type=str, help='<help text>')
args = parser.parse_args()
if args.action == "create":
# do the create stuff
if args.action == "update":
# do the update stuff
最好的方法是使用 subparser
文档中的示例:
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
... description='valid subcommands',
... help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage: [-h] {foo,bar} ...
optional arguments:
-h, --help show this help message and exit
subcommands:
valid subcommands
{foo,bar} additional help
在您的情况下,您会将 create
和 update
作为单独的子解析器。
示例:
def create(args):
# do the create stuff
print(args)
def update(args):
# do the update stuff
print(args)
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands',
description='valid subcommands',
help='additional help')
create_parser = subparsers.add_parser('create')
create_parser.add_argument('name', type=str)
create_parser.set_defaults(func=create)
update_parser = subparsers.add_parser('update')
update_parser.set_defaults(func=update)