已安装httpx但启动FastAPI报No module named 'httpx'错误
问题原因
出现该问题的核心是uvicorn --reload热重载模式拉起的业务子进程,未使用已安装httpx的虚拟环境Python解释器,子进程的模块搜索路径不包含虚拟环境的site-packages目录,因此无法找到已安装的httpx包,和依赖本身安装成功与否无关。
常见触发条件:
- 全局环境安装了uvicorn,启动时调用的全局uvicorn未关联当前虚拟环境解释器,热重载子进程默认调用全局Python解释器加载业务代码
- Python 3.6版本适配的旧版uvicorn存在热重载逻辑bug,无法自动继承当前终端的虚拟环境激活状态
- 项目根目录下存在命名为
httpx.py的文件或httpx命名的文件夹,触发模块搜索优先级冲突,覆盖了第三方httpx包的导入路径
修复步骤
按优先级从高到低依次操作:
- 排查命名冲突
遍历项目目录,检查是否存在和httpx同名的文件、文件夹,如果存在直接重命名,避免和第三方包名冲突。 - 显式指定解释器启动uvicorn
弃用直接调用uvicorn命令的启动方式,改用当前虚拟环境的Python解释器以模块方式调用uvicorn,强制所有关联进程(包括热重载子进程)使用当前虚拟环境的解释器与依赖路径,执行命令如下:# 执行前先确认输出路径为当前虚拟环境下的Python路径,排除全局解释器干扰 which python3 # 以模块方式启动uvicorn python3 -m uvicorn main:app --reload - 虚拟环境内重装uvicorn
如果之前在全局环境安装过uvicorn,先在已激活的虚拟环境内重新安装适配Python3.6的uvicorn版本,避免全局命令的路径干扰,执行命令如下:
安装完成后重新执行上一步的启动命令即可。pip3 install uvicorn[standard] - 版本兼容兜底
Python 3.6.9已停止官方维护,httpx 0.22.0是最后一个兼容Python3.6的正式版本,如果以上操作后仍存在导入异常,可强制重装对应兼容版本的httpx排除版本错配问题,执行命令如下:pip3 install httpx==0.22.0 --force-reinstall
内容的提问来源于stack exchange,提问作者saurabh kamble
相关产品推荐
相关产品推荐

