Python Django虚拟环境已安装requests模块但无法导入
命名冲突(概率最高)
Python导入模块时会优先搜索当前脚本所在目录、项目工作目录,之后才会遍历sys.path里的site-packages路径。如果你的ProjectFolder根目录、ProjectFolder\app_name\matches\脚本目录,或者其他sys.path优先级高于虚拟环境site-packages的路径下,存在自己写的requests.py文件、或是带__init__.py的requests文件夹,导入时就会直接加载这个自定义的同名文件/文件夹,根本不会读取虚拟环境里安装的正版requests。刚好其他第三方包没有同名冲突,所以能正常导入。
快速排查方式:在get_matches.py开头加两行代码执行:import requests print(requests.__file__)如果打印出的路径不是
ProjectFolder\.env\Lib\site-packages\requests\__init__.py,就能确认是命名冲突,把自定义的同名requests文件/文件夹改名即可解决。requests安装包损坏
你虽然执行过卸载重装,但如果安装时碰到杀毒软件拦截、磁盘写入权限不足、pip缓存损坏的问题,会出现site-packages里有requests文件夹,但核心文件缺失的情况。其他包安装时没碰到这类问题所以能正常导入。
修复方式:先手动删除虚拟环境site-packages下的requests文件夹、以及同目录下所有requests-*.dist-info开头的文件夹,激活虚拟环境后执行pip install --no-cache-dir --force-reinstall requests重新安装,装完确认requests文件夹下存在__init__.py、api.py等核心文件后再试导入。sys.path优先级异常,存在残缺包占位
如果你的PYTHONPATH环境变量里配置了其他Python包路径,或是全局Python环境中存在残缺的requests安装,且该路径的优先级高于虚拟环境的site-packages,就会优先加载那个残缺的requests。其他包因为在这个高优先级路径里没有对应文件,会fallback到虚拟环境site-packages加载,所以表现为只有requests导入失败。
排查方式:在脚本开头执行以下代码打印所有导入搜索路径:import sys for p in sys.path: print(p)按打印顺序挨个检查排在虚拟环境site-packages前面的路径,看是否存在requests相关的文件/文件夹,找到后删除残缺包即可。
文件夹权限异常(概率极低)
如果虚拟环境目录存在权限限制,当前运行脚本的用户没有requests文件夹的读取/执行权限,也会导致导入失败。这种情况一般会抛出PermissionError类型的报错,可以右键查看requests文件夹的安全属性,给当前运行用户分配读取、执行权限后重试。
内容的提问来源于stack exchange,提问作者Arbaks

