Python出现ModuleNotFoundError无法导入nsga_two模块问题求助
1. 直接from nsga_two import PatientProblem报错原因
Python导入模块时,只会搜索sys.path列表中包含的路径。你的nsga_two.py存放在eval子目录下,只要主脚本运行时的工作目录不是eval文件夹,nsga_two.py所在路径就不在默认搜索路径中,自然无法直接识别为顶层模块,触发ModuleNotFoundError。
额外注意:标识Python包的初始化文件必须是前后双下划线命名的__init__.py,如果你实际创建的是单下划线的_init_.py,Python不会将该文件夹识别为合法包,也会导致导入异常。
2. from eval import nsga_two.PatientProblem语法报错原因
Python的导入语法有明确规则:from后接包/模块的路径,import后只能跟模块名、或者模块中直接定义的可导出对象名,不支持带点的属性访问语法,所以该写法本身不符合语法规范,必然报错。
3. 去掉句点后导入报错原因
你去掉句点后语句变为from eval import nsga_twoPatientProblem,相当于要求从eval包中导入名为nsga_twoPatientProblem的对象,但eval包的__init__.py中没有定义这个名称的对象,自然会触发找不到导入对象的报错。
推荐的正确导入写法
除了你当前使用的from eval import nsga_two后再调用nsga_two.PatientProblem的方案外,还有两种更简洁的写法:
- 直接从子模块导入目标类:
from eval.nsga_two import PatientProblem - 如果想简化导入路径,可以在
eval文件夹的__init__.py中添加一行:
之后就能直接用from .nsga_two import PatientProblemfrom eval import PatientProblem导入目标类。
Spyder环境注意事项
Spyder默认的运行工作目录是当前打开脚本所在的文件夹,如果你的主脚本不在项目根目录(MoodForecasting文件夹)下,会导致项目根目录不在sys.path中引发导入失败。你可以在Spyder的运行配置中,固定将工作目录设置为你的项目根目录,也可以在主脚本开头添加如下代码手动添加搜索路径:
import sys # 替换为你本地MoodForecasting文件夹的绝对路径 sys.path.append("C:/Users/name/Desktop/MoodForecasting-master/MoodForecasting-master")
内容的提问来源于stack exchange,提问作者AcidCatfish

