基本预期用途:如何有条件地让蟒蛇的argparse模块需要额外的参数
my_framework create Project_title /path/to/project
OR
my_framework create Project_title
(即用当前的工作目录)
OR
my_framework update
(即更新my_framework而不是创建新项目)
我知道我可以做name
可选向其提供一个默认的,但是,在现实中name
是不提供可选用户输入create
作为第一个参数。
我想出的最佳解决方案是使用name
的默认值,然后如果参数name
等于其默认值,则会抛出错误。但是,如果有一种方法可以为我做这个工作,我宁愿学会这样做。
写两个脚本,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
你想用subparsers此:https://docs.python.org/2/library/argparse.html#argparse.ArgumentParser.add_subparsers – Wolph
我不完全理解题。为什么使用update调用my_framework时不需要名称?它不应该总是需要一个名字,以防用户有两个框架吗? –
对不起; 'update'适用于'MY_FRAMEWORK'而不是用它创建的项目(即它基本上检查github上的新版本,如果找到了它,则将其拉出)。 – Jonline