Python跨包导入类失败:ModuleNotFoundError问题求助
Python跨目录模块导入问题解决
项目结构
myproject ├── getdir │ ├── __init__.py │ └── somename.py # 包含classnameexample类 └── pushdir ├── __init__.py └── nicename.py # 需要导入classnameexample的文件
问题描述
在pushdir/nicename.py中尝试导入getdir/somename.py里的classnameexample类,使用from ..getdir.somename import classnameexample(相对导入)或直接from getdir.somename import classnameexample(绝对导入)均报错:
ModuleNotFoundError: No module named 'getdir'
解决方法
方法1:以包形式运行脚本(推荐)
不要直接运行nicename.py,回到myproject的上级目录,执行以下命令:
python -m myproject.pushdir.nicename
这种方式会让Python将myproject识别为一个包,此时nicename.py作为包的一部分,相对导入语句可正常生效。
方法2:手动添加项目根目录到Python路径
在nicename.py开头添加代码,将myproject目录加入Python搜索路径:
import sys import os # 获取myproject目录的绝对路径 project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if project_root not in sys.path: sys.path.append(project_root) # 使用绝对导入 from getdir.somename import classnameexample
这样无论从哪个路径运行nicename.py,Python都能找到getdir模块。
方法3:设置PYTHONPATH环境变量
在终端中先将myproject的路径添加到PYTHONPATH,再运行脚本:
- Linux/macOS:
export PYTHONPATH="/绝对路径/to/myproject:$PYTHONPATH" python myproject/pushdir/nicename.py - Windows(CMD):
set PYTHONPATH=C:\绝对路径\to\myproject;%PYTHONPATH% python myproject\pushdir\nicename.py - Windows(PowerShell):
$env:PYTHONPATH = "C:\绝对路径\to\myproject;" + $env:PYTHONPATH python myproject\pushdir\nicename.py
设置后,直接使用from getdir.somename import classnameexample即可完成导入。
问题原因
直接运行nicename.py时,Python会将pushdir目录加入搜索路径,而非myproject,因此无法找到同级的getdir模块;同时,相对导入仅能在被Python识别为包的模块中使用,直接运行脚本时该文件不会被视为包的一部分,导致相对导入失效。
内容的提问来源于stack exchange,提问作者user15175462
相关产品推荐
相关产品推荐

