Python导入类时‘.’的作用及包导入报错解决方案咨询
解决Python包导入错误的方案
首先咱们先明确你的目录结构应该是这样的(如果不是,调整成这个结构):
你的项目文件夹/ ├── main.py └── OOP_1/ ├── __init__.py ├── student.py └── course.py
为什么会出现这些错误?
- 相对导入的作用:你代码里的
.表示当前包(也就是OOP_1这个文件夹),from .student import Student的意思是「从当前包下的student模块导入Student类」,这是Python包内部模块互相引用的标准写法,完全没问题。 - 你遇到的
ModuleNotFoundError,核心原因是运行方式不对:如果你的终端当前工作目录不是包含main.py和OOP_1的父目录,Python就无法识别OOP_1是一个合法的包,导致相对导入失效。 - 你尝试移除
.改成from student import Student后,Python会去系统默认的模块路径找student模块,而不是OOP_1文件夹里的,所以自然找不到。
具体调整步骤
保持包内代码不变:
student.py不需要修改course.py里的from .student import Student保留__init__.py里的相对导入也保留,它的作用是把包内的类暴露出去,方便外部导入
正确运行main.py:
打开终端,导航到包含main.py和OOP_1的那个父目录,然后执行:python main.py比如你的项目文件夹叫
my_python_project,就先cd my_python_project,再运行上面的命令。测试验证:
可以在main.py里加几行测试代码,确认导入成功:from OOP_1 import * # 创建实例测试 student = Student("张三", "2024001") course = Course("Python编程", "PY101", 3, 40) print(f"学生姓名:{student._student_name}") print(f"课程名称:{course._name}")
额外说明
- 绝对不要随便修改包内的相对导入为绝对导入,除非你把
OOP_1的路径添加到Python的系统环境变量PYTHONPATH里,但日常开发中从父目录直接运行是最简洁的方案。 - 如果你的IDE(比如VSCode)里运行还是报错,可以检查IDE的「工作目录」设置,确保它指向包含
main.py和OOP_1的父文件夹。
内容的提问来源于stack exchange,提问作者yan




