Python3.9中子目录的__init__.py是否会触发父目录__init__.py执行?
问题原因解析
这是Python的包导入规则和pytest的默认导入逻辑共同导致的:
- 当
child_directory下没有__init__.py时,Python不会将该目录识别为合法的包。你在该目录下直接执行pytest test_a.py时,pytest只会把当前执行命令的工作目录(也就是child_directory)加入模块搜索路径sys.path,导入模块时直接在当前目录下查找,完全不会触发上层parent_directory的包逻辑,因此父目录的__init__.py不会被执行,自然不会触发依赖冲突。 - 当你给
child_directory新增__init__.py后,该目录会被识别为Python的正规子包。此时pytest会自动向上追溯到整个项目的根包(也就是parent_directory),并将根包目录加入sys.path优先搜索。Python导入子包下的模块前,会先执行父级包的__init__.py,再执行当前子包的__init__.py,因此父目录__init__.py里的冲突依赖导入会被触发,直接报错。
临时解决方案(可先完成测试再处理依赖冲突)
你可以用以下两种方法绕开该问题,不影响当前测试进度:
- 执行pytest时指定导入模式,避免触发父包逻辑,和无
__init__.py时的运行逻辑完全一致:
pytest test_a.py --import-mode=append
- 如果只是临时跑测试,也可以暂时把父目录的
__init__.py重命名为其他名称(比如__init__.py.bak),测试完成后再改回原名即可。
内容的提问来源于stack exchange,提问作者C Murphy
相关产品推荐
相关产品推荐

