Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有条件地使python';args解析模块需要其他参数_Python_Argparse - Fatal编程技术网

如何有条件地使python';args解析模块需要其他参数

如何有条件地使python';args解析模块需要其他参数,python,argparse,Python,Argparse,基本预期用途: my\u framework create Project\u title/path/to/Project 或 我的框架创建项目标题(即使用当前工作目录) 或 myu框架更新(即更新myu框架,而不是创建新项目) 我知道我可以通过提供默认值使name可选,但实际上name不是可选的,只要用户输入create作为第一个参数 我提出的最佳解决方案是为name使用默认值,然后,如果参数name等于其默认值,则抛出一个错误。但如果有办法让argparse为我做这件事,我宁愿学着去做 写两

基本预期用途:

my\u framework create Project\u title/path/to/Project

我的框架创建项目标题
(即使用当前工作目录)

myu框架更新
(即更新myu框架,而不是创建新项目)

我知道我可以通过提供默认值使
name
可选,但实际上
name
不是可选的,只要用户输入
create
作为第一个参数

我提出的最佳解决方案是为
name
使用默认值,然后,如果参数
name
等于其默认值,则抛出一个错误。但如果有办法让argparse为我做这件事,我宁愿学着去做

写两个脚本,
myu-framework\u-create
myu-framework\u-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
#/usr/bin/env python
导入argparse
导入操作系统
进口舒蒂尔
从子流程导入调用
template_path=“/usr/local/klibs/template”
parser=argparse.ArgumentParser(“MY_FRAMEWORK CLI”,description='创建新的MY_FRAMEWORK项目或更新MY_FRAMEWORK')
add_参数('action',choices=['create','update'],type=str,help='')
parser.add_参数('name',type=str,help='')
parser.add_参数('path',default=os.getcwd(),nargs=“?”,type=str,help=“”)
args=parser.parse_args()
如果args.action==“创建”:
#做创造的东西
如果args.action==“更新”:
#做更新的事情

最好的方法是使用

文档中的一个示例:

>>> 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
在您的情况下,您需要将
创建
更新
作为单独的子parser

例如:

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)

你想用次级帕斯来回答这个问题:我不完全理解这个问题。为什么使用update调用的my_框架不需要名称?如果一个用户有两个框架,它不应该总是需要一个名称吗<代码>更新适用于
MY_FRAMEWORK
而不是用它创建的项目(即,它基本上是在github上检查新版本,如果找到了,就会拉出来)。优雅。当
create
是第一个参数时,这将要求子parser的参数,而当输入
update
时,将忽略其他参数?@Jonline:是的,它将:)当输入
update
时,它将转到第二个子parser,使用
create
它将转到第一个子parser。这应该以一种干净的方式完全满足您的需求:)是的,我现在有了这个运行的、迷人的解决方案。代码中有两个小的语法错误(试图编辑但<6个字符):
update\u parser subparser。add\u parser('update')
需要
=
,并且
和setdefaults
都应该是蛇形结构。我想这就是在文本区域编码的结果。如果没有语法突出显示,我往往会出错;)