Python使用非相对路径导入兄弟模块函数遇ModuleNotFoundError问题
问题解答
1. 为什么有__init__.py仍找不到Example模块?
Python查找模块时只会在sys.path列表中的目录里搜索。当你直接运行B/functions.py时,Python会自动把该脚本所在的B目录加入sys.path,而Example包所在的父目录并不在这个搜索列表里——哪怕Example下有__init__.py,Python也找不到这个顶层包的位置,自然会报错。
2. 除修改sys.path外的解决办法,以及生产环境的运行逻辑
可行解决办法:
- 以模块方式运行脚本:切换到
Example的父目录,执行以下命令:
这种运行方式会把当前工作目录(Example的父目录)加入python -m Example.B.functionssys.path,Python就能正确识别Example这个顶层包,导入语句也能正常生效。 - 使用相对导入:把
B/functions.py里的导入语句改成相对路径形式:
注意这种写法同样需要用from ..A.functions import a_functionpython -m Example.B.functions运行,不能直接执行脚本(直接运行时相对导入会触发错误)。 - 打包安装Example包:通过
setup.py或pyproject.toml配置打包,将Example包安装到Python的site-packages目录(开发阶段可以用pip install -e .做可编辑安装,生产环境直接安装正式包)。安装后Example会成为全局可导入的包,无论在哪运行都能被Python找到。
生产环境的正常运行逻辑:
生产环境不会直接运行包内的单个脚本,通常是以下几种方式:
- 将整个
Example包安装到系统或虚拟环境的site-packages中,此时包在Python的默认搜索路径里,任何代码都能直接导入Example下的模块。 - 有一个独立的启动脚本放在
Example的父目录,由这个脚本负责导入Example包中的模块并执行逻辑,此时父目录在sys.path内,能正确识别包。 - 部分场景会通过设置
PYTHONPATH环境变量,把Example的父目录加入搜索路径,确保Python能定位到包。
内容的提问来源于stack exchange,提问作者linamamm
相关产品推荐
相关产品推荐

