如何构建兼容argparse、runpy测试与sphinx-doc的__main__.py结构?
解决方案
调整代码结构,将核心执行逻辑封装为可调用的main()函数,同时保留if __name__ == "__main__"入口,既满足-m执行、runpy测试需求,又避免sphinxarg.ext生成文档时意外执行代码。
调整后的__main__.py示例
import argparse def getparser(): parser = argparse.ArgumentParser(description="小型模块的命令行工具") # 添加你的参数定义 parser.add_argument("-v", "--verbose", action="store_true", help="启用详细输出") parser.add_argument("target", help="处理目标路径") return parser def main(args=None): # 解析参数:若传入args则用测试参数,否则读取命令行参数 parser = getparser() parsed_args = parser.parse_args(args) # 这里写你的核心业务逻辑 if parsed_args.verbose: print(f"开始处理目标: {parsed_args.target}") # ... 其他逻辑 if __name__ == "__main__": # 正常通过`-m`执行时,自动调用main() main()
各场景适配说明
1. runpy测试
测试时无需依赖模块__name__是否为__main__,直接调用main()并传入测试参数即可:
# 测试代码示例 from mymodule.__main__ import main # 传入模拟的命令行参数 main(["--verbose", "/test/path"]) # 或用runpy直接运行模块(此时模块__name__会被设为__main__,自动触发main()) import runpy runpy.run_module("mymodule", run_name="__main__")
2. python -m执行
保持原有使用方式,直接运行:
python -m mymodule --verbose /actual/path
3. sphinxarg.ext生成文档
sphinxarg.ext仅会导入模块并调用getparser()来提取参数信息,不会进入if __name__ == "__main__"分支,因此核心逻辑不会被意外执行,完美适配文档生成需求。
内容的提问来源于stack exchange,提问作者olebole
相关产品推荐
相关产品推荐

