CentOS下已安装xmpppy仍提示No module named 'xmpp'如何解决
问题场景
执行包含import xmpp,sys的Python脚本时抛出如下错误:
ModuleNotFoundError: No module named 'xmpp'
已执行pip install xmpppy安装对应依赖,且已验证脚本内print(sys.version)输出的版本号,与命令行执行python --version返回的版本号完全一致。
附完整测试脚本:
#!/usr/bin/env python #-*- coding: utf-8 -*- import xmpp,sys xmpp_jid = 'me@jabber.server' xmpp_pwd = 'hackme' to = sys.argv[1] msg = sys.argv[2] jid = xmpp.protocol.JID(xmpp_jid) client = xmpp.Client(jid.getDomain(),debug=[]) client.connect() client.auth(jid.getNode(),str(xmpp_pwd),resource='xmpppy') client.send(xmpp.protocol.Message(to,msg)) client.disconnect()
可行排查方向
- 修正依赖安装的调用方式:不要直接用
pip install安装,改用当前脚本调用的Python解释器直接执行pip模块安装,命令为python -m pip install xmpppy。CentOS环境常存在多套pip共存的情况,哪怕版本号显示一致,直接调用pip可能将包装到了其他Python环境的包目录下,和运行脚本的解释器路径不匹配,用解释器自带的-m pip参数可以100%保证包装到当前Python的对应路径下。 - 验证模块搜索路径与权限:在脚本导入xmpp的代码前加两行代码,打印Python的模块搜索路径列表:
执行import sys print(sys.path)python -m pip show xmpppy拿到依赖安装的Location路径,检查该路径是否在上面打印的路径列表中;同时进入该Location对应的目录,检查xmpp文件夹的读权限,若权限配置为仅root可读写,普通用户运行脚本时无法读取模块文件,也会抛出模块不存在的错误,这种情况给目录加全局读权限,或者加--user参数给当前用户重新安装一次用户级依赖即可。 - 排查同名文件冲突:检查脚本所在的工作目录下,是否存在命名为
xmpp.py的文件、或是名为xmpp的文件夹,Python导入模块时会优先检索当前工作目录,同名的自定义文件/文件夹会覆盖第三方库的导入逻辑,直接导致导入失败,把这类冲突文件重命名即可。 - 验证依赖安装完整性:执行
python -m pip show xmpppy拿到安装路径后,进入路径下的xmpp目录,检查是否存在__init__.py、protocol.py等核心文件,若文件缺失说明之前安装过程中因为网络、权限问题安装不完整,先执行python -m pip uninstall -y xmpppy卸载残留,再重新执行安装命令即可。 - 排查系统源包冲突:如果之前通过yum安装过系统源自带的
python-xmpp包,大概率会和pip安装的xmpppy产生路径冲突,先执行yum remove -y python-xmpp卸载系统自带的旧版本包,再重新通过pip安装xmpppy即可。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

