Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 3.7 ArgumentParser.add_子parser要求在选项之前有位置_Python_Python 3.x_Argparse - Fatal编程技术网

Python 3.7 ArgumentParser.add_子parser要求在选项之前有位置

Python 3.7 ArgumentParser.add_子parser要求在选项之前有位置,python,python-3.x,argparse,Python,Python 3.x,Argparse,我正在尝试创建一个python脚本,它将根据第一个位置参数执行另一个脚本。按照git add的git add行为方式思考 问题是ArgumentParser似乎希望列出位置子命令。。。最后。这是非常违反直觉的。(当您想要列出所有文件时,您需要的是ls-a[FILE positional],而不是-a ls[FILE positional],那么为什么它需要scriptname[optionals]子命令而不是scriptname子命令[optionals],因为'subcommand'是'rea

我正在尝试创建一个python脚本,它将根据第一个位置参数执行另一个脚本。按照git add的
git add
行为方式思考

问题是ArgumentParser似乎希望列出位置子命令。。。最后。这是非常违反直觉的。(当您想要列出所有文件时,您需要的是
ls-a[FILE positional]
,而不是
-a ls[FILE positional]
,那么为什么它需要
scriptname[optionals]子命令而不是
scriptname子命令[optionals]
,因为'subcommand'是'real'命令?)

玩具示例:

def get_arg_parser():
    parser = argparse.ArgumentParser()

    #  set up subprocessors
    subparser = parser.add_subparsers(required=True)

    parser.add_argument('--verbose', action='store_const', const=True, default=False, help="Enable verbose output.")

    subcommand1_subparser = subparser.add_parser('subcommand1')
    subcommand1_subparser.add_argument('--foo1', type=float)

    subcommand2_subparser = subparser.add_parser('subcommand2')
    subcommand2_subparser.add_argument('--foo2', type=float)

    return parser


if __name__ == "__main__":
    if len(sys.argv) > 1:
        get_arg_parser().parse_args()
        # more
    else:
        get_arg_parser().print_help()
问题是,如果我尝试运行
python-toyexample.py子命令1--verbose
,它会抱怨
错误:无法识别的参数:--verbose
。与此同时,
python-toyexample.py--verbose子命令1
也可以工作,但它要求在实际要运行的命令名称之前加上选项


我如何覆盖它?

多亏了@hpaulj,我找到了一个解决方案:只需将共享参数添加到两个子parser

我将
parser.add_参数('--verbose',action='store_const',const=True,default=False,help=“Enable verbose output.”)放在
add_shared_args_to_parser
to function的
行中,然后调用两次,传递子parser


最终的结果是子解析器有一些不幸的(但并不可怕的)重复,而主解析器只有子解析器。

您将“--verbose”定义为
解析器的参数。一旦
解析器
遇到'subcommand1',解析将传递给
subcommand1\u subparser
。就是那个下属抱怨未被认可的论点。子解析器完成后,主解析器不会继续解析。谢谢!这帮我找到了解决办法@布拉姆万罗伊:这完全是重点。请仔细阅读我写的内容:我说过这不是使用LS的方式,所以它当然是不正确的。