繁体   English   中英

如何有条件地使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可选,但实际上,如果用户输入create作为第一个参数,则name 不是可选的。

我想出的最佳解决方案是使用name的默认值,然后,如果参数name等于其默认值,则抛出错误。 但如果有办法让argparse为我做这项工作,我宁愿学会这样做。

编写两个脚本my_framework_createmy_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

在您的情况下,您将createupdate为单独的子分析程序。

例:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM