Python跨目录导入函数失败,已设置PYTHONPATH仍报错如何解决
Python跨目录导入失败解决方案
你遇到的报错本质是Python的模块搜索路径(sys.path)中没有包含对应包的父目录,或是运行方式不符合相对导入的规则,对应解决方案如下:
1. 先校验PYTHONPATH配置是否生效
- 你需要添加到PYTHONPATH的是trading目录的上级目录的绝对路径,而非trading目录本身。例如你的trading文件夹路径为
C:\code\trading,则PYTHONPATH中需要新增的路径是C:\code - 配置完成后必须重启所有正在运行的终端、IDE窗口,新的环境变量才会生效
- 可以在models.py开头加入以下代码确认路径是否被正确加载:
import sys print(sys.path)
如果能看到你新增的路径出现在输出列表中,才代表配置生效。
2. 修正脚本运行方式
如果你是直接通过python models.py的方式运行文件,Python会将models.py所在的app目录作为顶层执行目录,无法识别上层的trading包,自然找不到db模块。
正确运行方式为:
- 终端切换到trading目录的上级目录(也就是你加入PYTHONPATH的那个目录)
- 以模块形式运行:
python -m trading.app.models
这种运行方式下,以下两种导入写法都可以正常使用:
# 绝对导入(更稳定,推荐) from trading.db.engine import load_engine # 相对导入 from ..db.engine import load_engine
3. 临时兼容方案
如果你不想修改运行方式,可以在models.py的最开头手动将trading的上级目录加入模块搜索路径:
import sys from pathlib import Path # 层级说明:__file__对应models.py的路径,parent三级分别对应app、trading、trading的上级目录 sys.path.append(str(Path(__file__).parent.parent.parent.resolve())) # 后续就可以正常用绝对导入 from trading.db.engine import load_engine
内容的提问来源于stack exchange,提问作者Jonathan Bechtel
相关产品推荐
相关产品推荐

