首页 > 解决方案 > 使用多个文件管理 argparse

问题描述

我在 mainParser.py 中有一个解析器

这个解析器非常基础,只有 -h 和 -v 选项。

但是,它也有subparsers.

每个子解析器都在不同的文件sub_1.py, sub_2.py等中。

所有(子)解析器函数都在parserFunctions.py

这是层次结构:

Parsers /
    ParserPackage /
        - __init__.py
        - mainParser.py
        - sub_1.py
        - sub_2.py
        - parserFunctions.py

主解析器.py:

import argparse
from Parsers.ParserPackage.parserFunctions import mainParserFunc

mainParser = argparse.ArgumentParser(
    prog="XXX",
    description="YYY",
    add_help=False
)

SUBPARSER = mainParser.add_subparsers(title="ZZZ")

mainParser.add_argument(...)
    .
    .
    .
mainParser.set_defaults(func=mainParserFunc)

sub_1.py

from Parsers.ParserPackage.parserFunctions import sub_1_parserFunc
from Parsers.ParserPackage.mainParser import SUBPARSER

sub_1_parser = SUBPARSER.add_parser(name="AAA")
sub_1_parser.add_argument(...)
    .
    .
    .
sub_1_parser.set_defaults(func=sub_1_parser_parserFunc)

sub_2.py

from Parsers.ParserPackage.parserFunctions import sub_2_parserFunc
from Parsers.ParserPackage.mainParser import SUBPARSER

sub_2_parser = SUBPARSER.add_parser(name="BBB")
sub_2_parser.add_argument(...)
    .
    .
    .
sub_2_parser.set_defaults(func=sub_2_parser_parserFunc)

问题:

当我打电话时mainParser.parse_args(myArgs.split()):它说'无效选择'AAA'/'BBB'(从 中选择)。

为什么?

标签: pythonimportpython-importargparse

解决方案


经过多次尝试,我找到了解决方案。

由于 mainParser 没有导入子解析器(显然),它不知道它们的存在。

正确的解决方案是创建一个新文件,该文件将导入 mainParser 以及所有子解析器。导入发生时 - 它加载代码,然后正确定义 mainParser


推荐阅读