Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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 其他参数隐含的argparse子parser_Python_Argparse_Subparsers - Fatal编程技术网

Python 其他参数隐含的argparse子parser

Python 其他参数隐含的argparse子parser,python,argparse,subparsers,Python,Argparse,Subparsers,通常定义子Parser的方法是 master_parser = argparse.ArgumentParser() subparsers = master_parser.add_subparsers() parser = subparsers.add_parser('sub') parser.add_argument('--subopt') 而副检察官会被打电话 command sub --subopt 我正在实现一个调用多个转换器的包。如果我使用通常的次帕斯方法,我将不得不这样做 conv

通常定义子Parser的方法是

master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')
而副检察官会被打电话

command sub --subopt
我正在实现一个调用多个转换器的包。如果我使用通常的次帕斯方法,我将不得不这样做

convert ext1_to_ext2 file.ext1 file.ext2 --args
因为用户可能会调用

convert ext1_to_ext3 file.ext1 file.ext2 --args
我更喜欢从主解析器自动确定子解析器,以便用户可以使用命令

convert file.ext1 file.ext2  EXTRA
argparse
将从
file.ext1
file.ext2
确定子parser
ext1\u到ext2
,并调用子parser
ext1\u到ext2
来解析
EXTRA
。当然,
EXTRA
这里是子parser-specific

我尝试为每个转换器使用参数组(
add_argument_group
),但参数组中的参数不能重叠,并且我从所有解析器获得了一个混乱的组合参数列表,因此使用子参数似乎是一种可行的方法

我尝试使用带有两个位置参数的
parse_known_args
,确定并使用适当的子parser来解析其余的args,但很难从帮助消息中为用户提供转换器及其参数的列表


有什么方法可以做到这一点吗?

推断要使用的子parser很棘手,因为在检查以下每个参数时,需要重新实现
argparse
本身使用的许多逻辑

一种更简单的方法是使用subparser命令,它随后允许您“类型检查”以下参数,以确保它们使用正确的参数。比如说

# This allows a file name ending with any of the given extensions,
# or allows "file.1" in place of "file.1.jpg"
def jpeg_file(s):
    for ext in ("jpg", "jpeg"):
        if s.endswith(ext) or os.path.exists("%s.%s" % (s, ext)):
            return s
    raise argparse.ArgumentTypeError()

def tiff_file(s):
    # similar to jpeg_file

master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
jpg_to_tiff_parser = subparsers.add_parser('sub')
jpg_to_tiff_parser = parse.add_argument('jpg', type=jpg_file)
jpg_to_tiff_parser = parse.add_argument('tiff', type=tiff_file)

在我看来,这给了你更多的控制权。它正朝着你的要求前进。只需根据需要添加文件扩展名检查

#prog.py
topParser=argparse.ArgumentParser()

subParsers = topParser.add_subparsers(
    title='SubCommands', 
    description='Use "prog.py <subCommand> (-h | --help)" to learn more about each subcommand', 
    help='I can do stuff')

subParser1 = subParsers.add_parser('use1', help="Use1 does one thing")
subParser2 = subParsers.add_parser('use2', help='Use2 does another thing')

subParser1.add_argument(
    '-f','--first-arg-for-use1',
    help="A text file",
    required=True
    )

subParser1.add_argument(
    '-s','--second-arg-for-use1',
    help="An encoding",
    required=True
    )

subParser2.add_argument(
    '-f','--first-arg-for-use2',
    help="An image format",
    required=True
    )

args = topParser.parse_args()
print(args)
#prog.py
topParser=argparse.ArgumentParser()
subParsers=topParser.add_subParsers(
title='SubCommands',
description='Use“prog.py(-h |--help)”了解有关每个子命令的更多信息',
帮助(我能做些事情)
subParser1=subParsers.add_解析器('use1',help=“use1做一件事”)
subParser2=subParsers.add_解析器('use2',help='use2做另一件事')
subParser1.add_参数(
'-f','-first-arg-for-use1',
help=“文本文件”,
必需=真
)
subParser1.add_参数(
'-s','-second-arg-for-use1',
help=“一种编码”,
必需=真
)
subParser2.add_参数(
'-f','-first-arg-for-use2',
help=“图像格式”,
必需=真
)
args=topParser.parse_args()
打印(args)

如果没有其他内容,它将显示如何处理不同层的帮助文本。

是否可以使用?这将允许您解析参数的第一部分,自己评估适当的子parser,然后将剩余的参数传递给适当的子parser。这是我现在正在采取的方法,但我正在努力为用户提供帮助消息。似乎我需要劫持
convert file.ext1 file.ext2-h
来打印来自另一个解析器的帮助消息,但我仍然无法列出
convert-h
中所有可用的转换器(也许一个
epilog
可以工作)。您要求的逻辑对于
argparse
来说是不合理的。直接解析
sys.argv
,或者通过
argparse
以简单字符串的形式获取值,然后推断应该采取的操作。但是命令行仍然是
convert sub file.jpg file.tiff
。我刚刚有了一个很棒的(?)主意,劫持sys.argv怎么样?我可以检查
sys.argv[1]
sys.argv[2]
,在
sys.argv[1]
之前插入适当的子parser名称,并使用所有子parser调用
主解析器。不过,
-h
消息可能有点不对劲。虽然前两个位置参数不一定是
sys.argv[1]
sys.argv[2]
,但这种方法没有明显的问题。