openpyxl与pyodbc是否冲突?Ubuntu24.04+Python3.12连接异常排查
问题分析:Ubuntu 24.04 + Python3.12下pyodbc与openpyxl导入顺序导致MySQL连接异常
核心现象
Ubuntu 24.04升级后,Python3.12环境下出现两种截然不同的执行结果:
- 先同时导入
pyodbc和openpyxl,再调用pyodbc.connect(),会触发找不到libmyodbc9a.so的报错 - 先调用
pyodbc.connect()建立连接,再导入openpyxl,则程序正常运行
可能的原因
- openpyxl依赖修改动态链接环境:openpyxl依赖的第三方库(如
lxml)在导入时,可能修改了系统LD_LIBRARY_PATH或Python的动态链接加载上下文。Ubuntu 24.04的库路径结构、Python3.12的动态链接逻辑与旧版本存在差异,导致pyodbc后续加载libmyodbc9a.so时,无法定位到正确路径。 - pyodbc的延迟加载特性:pyodbc并非在导入阶段就加载所有依赖的动态库,而是等到调用
connect()时才尝试加载libmyodbc9a.so。如果此时openpyxl已经导入并修改了加载环境,就会触发加载失败;而先执行connect(),pyodbc会在环境被修改前完成库加载,因此不受影响。 - 系统库路径的版本变化:Ubuntu 24.04可能调整了MySQL ODBC驱动的默认安装路径,或系统默认的库搜索规则。pyodbc导入时缓存的路径信息,会被openpyxl导入后的环境变化覆盖,导致后续驱动查找失败。
结论
这个异常并非Python导入机制本身的bug,更可能是openpyxl依赖对动态链接环境的修改,结合pyodbc的延迟加载逻辑,与Ubuntu 24.04 + Python3.12的新环境产生冲突导致的。调整导入顺序的临时方案可行,长期可以尝试更新pyodbc/openpyxl到最新版本,或手动指定MySQL ODBC驱动的加载路径(比如在代码中设置LD_LIBRARY_PATH)来规避。
内容的提问来源于stack exchange,提问作者Marc Vanhoomissen
相关产品推荐
相关产品推荐

