如何动态获取Python包目录绝对路径解决终端模块导入报错
命令行运行Python脚本导包失败解决方案
问题根因
PyCharm运行时会自动将项目根目录加入Python的模块搜索路径sys.path,因此可以正常识别project顶层包;终端直接运行脚本时默认仅将脚本所在的project/apps目录加入sys.path,无法找到上层的project包,因此抛出ModuleNotFoundError。
解决方案
你的思路方向正确,不过匹配你现有from project.resources import somemodule的导包写法,更合理的做法是将**项目根目录(包含project文件夹的myapp目录)**加入sys.path,无需单独加resources目录。
动态获取路径并添加到sys.path(推荐pathlib写法,兼容Python3.4+)
在someapp.py的最开头、所有导包语句之前加入以下代码:
import sys from pathlib import Path # 获取当前脚本的绝对路径 current_script_path = Path(__file__).resolve() # 向上遍历3级父目录得到项目根目录:someapp.py → apps → project → 项目根目录(myapp) project_root = current_script_path.parent.parent.parent # 将项目根目录加入模块搜索路径的最高优先级 sys.path.insert(0, str(project_root))
单独获取resources目录的绝对路径
在上述代码的基础上,直接拼接路径即可得到你需要的resources绝对路径:
resources_absolute_path = project_root / "project" / "resources" # 转换为字符串格式即可直接使用 print(str(resources_absolute_path))
兼容旧版本Python的os模块写法
如果你的Python版本低于3.4,可以用os模块实现相同功能:
import sys import os # 获取当前脚本的绝对路径 current_script_path = os.path.abspath(__file__) # 向上遍历3级得到项目根目录 project_root = os.path.dirname(os.path.dirname(os.path.dirname(current_script_path))) sys.path.insert(0, project_root) # 获取resources目录绝对路径 resources_absolute_path = os.path.join(project_root, "project", "resources")
额外说明
该方案为动态路径获取逻辑,无论你将整个项目迁移到任何本地目录,都不需要修改代码即可正常运行。
内容的提问来源于stack exchange,提问作者rdediana
相关产品推荐
相关产品推荐

