导入自定义模块后scipy.stats丢失 WSL命令行运行报错如何解决
问题解决步骤
1. 排查本地文件命名冲突
这是该类导入报错最常见的根因,先检查当前工作目录、模块导入路径下是否存在命名为scipy.py、stats.py的自定义脚本或同名文件夹,执行以下命令快速排查:
# 在bar.py所在目录执行 find . -name "scipy.py" -o -name "stats.py"
如果找到对应文件,直接修改其命名,同时删除所有缓存文件避免旧逻辑残留:
find . -name "__pycache__" -type d -exec rm -r {} +
同时检查已导入的其他模块(psd_processing、uptake_processing)中是否存在将scipy作为变量名重赋值的逻辑,也可以在bar.py开头加入以下代码校验scipy加载路径是否正确:
import scipy print(scipy.__file__)
正常输出应为系统scipy安装路径,格式类似/usr/lib/python3.x/site-packages/scipy/__init__.py,如果输出为你自己目录下的文件,即可确认存在命名冲突。
2. 修正Python模块搜索路径优先级
因为未使用虚拟环境,可能存在模块搜索路径混乱的问题,先通过命令获取scipy实际安装路径:
pip3 show scipy | grep Location
将输出的路径添加到bar.py最开头,强制提升系统模块的搜索优先级:
import sys # 替换为上一步获取到的scipy安装路径 sys.path.insert(0, "/usr/local/lib/python3.8/dist-packages")
3. 调整导入写法为函数内部延迟导入
你提到报错出现在linregress调用行而非导入行,说明导入时存在时序性的变量覆盖问题,将scipy相关导入直接写入foo函数内部即可规避冲突:
import numpy as np def foo(df_1, df_2, data_dict): from scipy.stats import linregress # 其余原有代码保持不变 for index, row in df_2.iterrows(): x = [] for d in data_dict: x.append(row[d]) x = np.array(x) for index, row in df_1.iterrows(): y = [] for d in data_dict: y.append(row[d]) y = np.array(y) s, i, r, p, se = linregress(x, y)
4. 校验Python与pip版本匹配度
可能存在pip安装的模块和运行代码的Python版本不匹配的问题,执行以下命令校验:
python3 -m pip list | grep scipy
如果输出中没有scipy,说明你之前用pip安装的模块不在当前python3的搜索路径下,用以下命令重新安装即可:
python3 -m pip install --force-reinstall scipy
内容的提问来源于stack exchange,提问作者blanky
相关产品推荐
相关产品推荐

