Conda已装requests但导入报ModuleNotFoundError的解决方法
问题背景
已成功激活名为env1的conda虚拟环境,执行conda list可见已安装PyPI源的2.28.0版本requests库,但进入Python交互环境执行import requests时触发如下报错:
ModuleNotFoundError: No module named 'requests'
相关conda列表片段、终端状态如下:
qtconsole 5.3.0 pyhd3eb1b0_0 qtpy 2.0.1 pyhd3eb1b0_0 readline 8.1.2 h7f8727e_1 regex 2022.6.2 pypi_0 pypi requests 2.28.0 pypi_0 pypi responses 0.18.0 pypi_0 pypi rouge-score 0.0.4 pypi_0 pypi send2trash 1.8.0 pyhd3eb1b0_1
(env1) june@vgpu1:~$
排查流程
- 先核对当前Python解释器是不是属于env1环境
进入报错的Python交互终端,执行以下代码:
正常输出的路径必须包含import sys print(sys.executable)envs/env1/片段,如果输出是系统全局Python路径、或者其他虚拟环境的路径,就算终端前缀显示(env1),实际跑代码的解释器也不对,一般是shell里配了python别名、或者环境变量优先级错乱导致的。 - 再核对requests的实际安装位置
保持env1激活状态,在终端执行:
看返回结果里的pip show requestsLocation字段,正常路径应该落在env1环境的site-packages目录下,如果路径指向别的环境,说明之前装requests的时候,调用的pip根本不是env1环境的,conda list能扫到是因为conda会索引全局包缓存,不代表包装在当前环境里。 - 最后核对Python的包搜索路径
回到Python交互终端执行:
逐行看输出的路径里,有没有上一步查到的requests安装目录,如果没有,就算包真的存在,Python也搜不到这个包。import sys print('\n'.join(sys.path))
解决方法
- 针对解释器不匹配的情况
先检查shell配置文件(~/.bashrc、~/.zshrc这类)里有没有手动给python、pip命令加别名,有的话删掉对应配置,重启终端再重新激活env1。如果还是不对,可以直接在激活env1后执行conda install python,重新在env1里装一遍对应版本的Python,自动修复路径关联。 - 针对包装错位置的情况
激活env1之后,不要直接用pip install命令,用当前环境的Python主动调用pip来强制重装,从根源避免pip和Python版本不对应:python -m pip install requests==2.28.0 --force-reinstall - 针对包搜索路径缺失的情况
直接执行上面的强制重装命令就行,重装过程会自动把包的路径注册到当前环境的Python搜索路径里,不需要手动改配置。
内容的提问来源于stack exchange,提问作者June Yoon
相关产品推荐
相关产品推荐

