已安装amqplib包内出现ModuleNotFoundError故障排查求助
解决amqplib新环境下的ModuleNotFoundError问题
问题根源
这个报错是因为amqplib的client_0_8/__init__.py使用了隐式相对导入(比如from basic_message import *),而Python 3.3+对这种导入逻辑的处理更严格,再加上新版pip安装包时的结构变化,导致旧的导入方式失效。你同事早期安装没问题,大概率是当时用的pip或amqplib版本本身兼容这种导入写法。
实用解决办法
1. 安装特定历史版本的amqplib
试试安装更早期的amqplib版本,这些版本的导入逻辑可能还适配新环境:
pip install amqplib==0.6.1
如果这个版本不行,换1.0.2试试。最稳妥的方式是直接复刻你同事的依赖环境:
# 让同事在他的环境执行 pip freeze > amqplib-requirements.txt # 你拿到文件后在自己环境执行 pip install -r amqplib-requirements.txt
2. 在代码里临时补全导入路径
不用修改amqplib源码,在项目导入amqplib的代码前加一段路径处理,让Python能找到对应的模块:
import sys import os # 先获取client_0_8模块的所在目录 from amqplib import client_0_8 # 把这个目录加入Python的搜索路径 sys.path.insert(0, os.path.dirname(client_0_8.__file__)) # 再正常导入 import amqplib.client_0_8 as amqp
3. 使用第三方修复版的amqplib
找一个已经把隐式相对导入改成显式(比如from .basic_message import *)的amqplib第三方修复版本,通过git仓库安装:
pip install git+https://github.com/[修复者用户名]/amqplib.git
(替换成实际存在的修复仓库地址即可)
4. 自动修改包内源码(应急方案)
如果以上方法都走不通,写个小脚本自动修改amqplib的导入语句,无需手动操作:
import os import site # 定位amqplib的__init__.py文件 amqplib_init = os.path.join(site.getsitepackages()[0], 'amqplib/client_0_8/__init__.py') # 替换所有隐式相对导入为显式 with open(amqplib_init, 'r+') as f: content = f.read() content = content.replace('from basic_message import *', 'from .basic_message import *') content = content.replace('from channel import *', 'from .channel import *') content = content.replace('from connection import *', 'from .connection import *') content = content.replace('from exchange import *', 'from .exchange import *') content = content.replace('from message import *', 'from .message import *') content = content.replace('from queue import *', 'from .queue import *') f.seek(0) f.write(content) f.truncate()
运行这个脚本后再启动项目即可。
内容的提问来源于stack exchange,提问作者Aleks Lee
相关产品推荐
相关产品推荐

