多文件拆分管理argparse子解析器时子命令AAA/BBB无法识别问题
问题原因
- 核心原因是子解析器的注册代码从未被执行:你将
AAA、BBB两个子解析器的定义逻辑写在独立的sub_1.py、sub_2.py文件中,Python只有在导入这两个模块时,才会运行SUBPARSER.add_parser()代码,把对应子命令注册到主解析器的子命令列表中。 - 你当前的调用流程只导入了
mainParser.py中的mainParser对象,没有提前导入两个子解析器模块,主解析器的子命令列表为空,因此会抛出invalid choice 'AAA'/'BBB' (choose from )的错误,报错信息中括号内为空就是没有注册任何子命令的表现。
另外你现有代码还存在笔误:sub_1.py里set_defaults(func=sub_1_parser_parserFunc)多写了一个_parser后缀,需要和导入的函数名一致改为sub_1_parserFunc,sub_2.py同理存在该笔误。该问题不会触发当前报错,但子命令运行时会抛出函数未定义错误。
解决方案
你只需要确保子解析器模块在调用parse_args()之前被导入即可,推荐以下两种方案:
- 方案1:在
mainParser.py末尾主动导入子解析器模块,加载主解析器时自动完成子命令注册:
# mainParser.py 末尾添加以下代码 from . import sub_1 from . import sub_2
- 方案2:在你调用
mainParser.parse_args(myArgs.split())的代码前,主动导入两个子解析器模块:
from Parsers.ParserPackage import sub_1, sub_2
内容的提问来源于stack exchange,提问作者Yoni Melki
相关产品推荐
相关产品推荐

