Python 3导入含__init__.py的包时遇ModuleNotFoundError,Python 2正常
嘿,这个问题其实是Python 2和Python 3在模块导入机制上的一个关键差异导致的,我来给你拆解清楚:
问题根源
Python 2 和 Python 3 对包内模块的导入规则有明显区别:
- 在 Python 2 中,允许隐式相对导入:当你在
package/__init__.py里写from modu import value时,解释器会优先在当前包(package目录)下查找modu.py,所以能成功导入变量。 - 在 Python 3 中,默认启用绝对导入:此时
from modu import value会直接去系统路径(sys.path)的顶级目录里找modu模块,而你的modu.py是嵌套在package目录下的,不在顶级路径中,自然就抛出ModuleNotFoundError了。
解决方法
这里有几种靠谱的修复方式,都能兼容Python 2和3:
方法1:使用显式相对导入(推荐)
修改package/__init__.py的内容为:
from .modu import value
这里的.代表当前包目录,属于显式的相对导入,Python 3 完全支持,同时也能被 Python 2 识别。
方法2:使用绝对导入
基于包的完整路径来导入,修改package/__init__.py为:
from package.modu import value
这种写法会直接从顶级包package开始查找模块,只要project目录在sys.path中(你在project下运行test.py时会自动加入),就能正常导入。
方法3:不推荐的临时方案(修改sys.path)
如果你实在不想改导入语句,可以在__init__.py开头手动把当前包目录加入sys.path,但这种方式容易引发路径冲突,不建议长期使用:
import sys import os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from modu import value
改完之后,再运行test.py,不管是Python 2还是3都能正常输出99啦。
内容的提问来源于stack exchange,提问作者Khanh Do
相关产品推荐
相关产品推荐

