Python本地模块导入问题:跨目录模块引用报错求解
Python模块导入问题解决方案
项目结构
project_folder |--configuration |--__init__.py |--config.py |--info.py |--data |--src |--models |--model.py |--scripts |--collect.py |--tools |--__init__.py |--utils.py |--process.py |--train |--trainModel.py |--server.py
问题背景
configuration/config.py通过import info导入同目录下的info.py(依赖其中的一个列表)。- 在
src/tools/utils.py中尝试用import configuration.config as con导入时,触发错误:ModuleNotFoundError: No module named 'configuration'。 - 添加
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))后,又出现新错误:ModuleNotFoundError: No module named 'info'。
可行解决方案
方法1:修正config.py的相对导入(推荐)
问题根源是 config.py 里的 import info 是隐式相对导入,当项目根目录加入sys.path后,Python会把它当作顶级模块去查找,找不到同目录的文件。改成显式相对导入即可:
# configuration/config.py from . import info
然后在 src/tools/utils.py 中保留路径添加代码,使用绝对导入:
# src/tools/utils.py import os import sys # 将项目根目录添加到Python路径 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) import configuration.config as con
方法2:调整utils.py的路径配置(无需修改config.py)
如果不想改动config.py,可以在utils.py中先把 configuration 目录也加入sys.path,确保config.py能找到info:
# src/tools/utils.py import os import sys root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) sys.path.append(root_dir) # 将configuration目录添加到路径,让config.py能直接找到info sys.path.append(os.path.join(root_dir, 'configuration')) import configuration.config as con
方法3:设置PYTHONPATH环境变量(长期最优方案)
不需要修改任何代码,直接在运行脚本前将项目根目录加入PYTHONPATH:
- Linux/macOS终端:
export PYTHONPATH=/path/to/your/project_folder:$PYTHONPATH
- Windows命令行:
set PYTHONPATH=C:\path\to\your\project_folder;%PYTHONPATH%
设置完成后,直接在utils.py中使用绝对导入即可:
# src/tools/utils.py import configuration.config as con
此时config.py里的 import info 也能正常工作,因为Python会自动在 configuration 包内查找模块。
内容的提问来源于stack exchange,提问作者jon gluestick
相关产品推荐
相关产品推荐

