Python3版本自定义模块导入报错 如何实现Python2和Python3双版本兼容
问题根源
Python 3 默认启用绝对导入规则,util.py 中原有的 from config import CONTROL_VAR 会优先查找全局安装的config模块,而不是当前自定义config包下的config.py文件,因此导入失败。Python 2 默认优先相对导入,所以原有代码可以正常运行。
兼容Python2/3的修改方案
1. 修改 config/util.py 的导入语句
将原有导入改为显式相对导入即可对齐两个版本的导入规则:
# 替换原有 from config import CONTROL_VAR 行 from .config import CONTROL_VAR if CONTROL_VAR == "A": VAR_ONE = "A1" else: VAR_ONE = "B1"
2. 可选:补充config/__init__.py内容(更规范)
在包初始化文件中添加绝对导入声明,避免Python2环境出现导入歧义:
from __future__ import absolute_import # 可选:统一导出常用变量,后续可直接通过 from config import CONTROL_VAR 导入 from .config import CONTROL_VAR from .util import VAR_ONE
3. 极端情况适配:补充工作目录检索规则
如果运行时仍出现找不到包的报错,可以在my_script.py开头添加路径配置,保证自定义包能被Python检索到:
import sys import os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 原有导入逻辑不变 from config.config import CONTROL_VAR from config.util import VAR_ONE if __name__ == "__main__": print(CONTROL_VAR) print(VAR_ONE)
内容的提问来源于stack exchange,提问作者Ryag1
相关产品推荐
相关产品推荐

