Python3.9 pipenv环境requests.packages.urllib3.util.retry导入报错
这个导入报错和依赖是否安装、pipenv虚拟环境是否正常没有直接关系,核心原因是requests 2.16.0及以上版本调整了内部依赖的暴露逻辑,不再将urllib3的完整子模块路径挂载到requests.packages命名空间下,旧教程里常见的from requests.packages.urllib3.xxx导入写法已经不兼容新版本。
你看到的Import "requests.packages.urllib3.util.retry" could not be resolved. No quick fixes available.提示,除了实际导入路径错误之外,也有可能是代码编辑器(比如VS Code的Pylance插件)没有正确关联pipenv虚拟环境的解释器,导致静态解析失败出现误报。
1. 替换导入语句(必改,解决实际运行报错)
直接将第13行的旧导入语句删除,替换为从urllib3直接导入Retry类即可:
# 注释或删除原有错误导入 # from requests.packages.urllib3.util.retry import Retry # 替换为标准导入写法 from urllib3.util.retry import Retry
urllib3是requests的强制依赖,只要你安装了requests,urllib3就会被同步安装到虚拟环境中,不需要额外执行安装操作,这种导入方式也是目前兼容所有新版本requests的标准写法。
2. 修复编辑器静态检查误报(改完导入仍飘红时操作)
如果替换导入语句后代码可以正常运行,但编辑器仍然提示导入无法解析,是因为编辑器没有识别到pipenv虚拟环境的Python解释器,按以下步骤操作即可:
- VS Code按快捷键
Ctrl+Shift+P调出命令面板,输入Python: Select Interpreter - 在弹出的列表中选中当前项目pipenv虚拟环境对应的Python 3.9解释器
- 重启编辑器后红标提示就会消失
你的代码中DidYouKnow类定义了两个__init__方法,Python中类的同名方法会被后定义的版本覆盖,前面写的无参__init__永远不会被触发,如果后续需要无参实例化类会直接报错,可以根据需求合并两个初始化方法的逻辑。
内容的提问来源于stack exchange,提问作者Nothingness

