为什么在Spyder单元格中运行代码时Python找不到同文件夹下的模块
问题原因
这个问题核心是Spyder运行单元格和运行完整脚本时的默认工作目录不一致,Python导入模块时会优先搜索sys.path中罗列的路径,同目录模块能导入的前提是模块所在目录在sys.path里:
- 运行完整脚本时,Spyder默认会自动将工作目录切换为当前脚本所在的文件夹,该路径会自动加入
sys.path,因此同目录的Run_Simulations、SetUpScenarios可以被正常识别。 - 单独运行单元格时,Spyder默认沿用IPython控制台的当前工作目录,而非当前编辑脚本的所在目录。如果控制台的工作目录和脚本目录不一致,模块所在路径就不在
sys.path中,就会触发模块不存在的报错。
验证方法
在导入单元格的最顶部添加如下代码,单独运行单元格即可确认问题:
import os import sys # 打印当前工作目录 print("当前工作目录:", os.getcwd()) # 打印模块搜索路径 print("模块搜索路径:", sys.path)
如果输出的当前工作目录不是你脚本、两个模块文件所在的文件夹,即可确认是该原因导致的报错。
解决方案
永久生效方案
修改Spyder默认配置即可一劳永逸解决:
- 打开Spyder顶部菜单栏「工具」-「偏好设置」
- 找到「IPython控制台」-「运行」选项卡
- 在「运行单元格时的工作目录」分类下,勾选「切换到当前编辑器的文件所在目录」
- 保存设置后重启IPython控制台,后续单独运行单元格就会自动切换到脚本所在目录。
临时兼容方案
如果不想修改全局配置,可以在导入单元格开头手动添加模块所在路径到搜索路径:
import os import sys # 把当前脚本所在目录加到模块搜索路径最前面 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
如果部分Spyder版本运行单元格时无法识别__file__,可以手动写死模块所在的绝对路径:
import sys # 替换为你自己的模块所在文件夹的绝对路径 sys.path.insert(0, "C:/xxx/你的脚本所在文件夹路径")
内容的提问来源于stack exchange,提问作者PeterBe
相关产品推荐
相关产品推荐

