Python 3.11中导入Pandas导致pyodbc.connect连接失败求助
问题场景
Ubuntu 22.04 + Python 3.11环境下,单独导入pyodbc==5.0.1可正常连接本地MySQL;但先导入pandas==2.1.2再导入pyodbc时,抛出驱动找不到的错误:
'01000', '[01000] [unixODBC][Driver Manager]Can't open lib '/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8w.so' : file not found (0) (SQLDriverConnect)'
旧环境(Ubuntu 20.04 + Python 3.10 + pandas1.5.3 + pyodbc5.0.1)可正常运行,已尝试调整导入顺序、降级Pandas、切换Python 3.10、更换libmyodbc8驱动版本,均未解决。
可行解决方案
1. 排查环境变量被Pandas修改的情况
Pandas导入时可能会修改动态链接库搜索路径(LD_LIBRARY_PATH)或ODBC相关环境变量,导致驱动无法被找到。分别运行两段代码对比输出:
单独导入PyODBC时的环境变量
import os import pyodbc print("LD_LIBRARY_PATH:", os.environ.get('LD_LIBRARY_PATH')) print("ODBCINI:", os.environ.get('ODBCINI')) print("ODBCSYSINI:", os.environ.get('ODBCSYSINI'))
先导入Pandas再导入PyODBC时的环境变量
import os import pandas import pyodbc print("LD_LIBRARY_PATH:", os.environ.get('LD_LIBRARY_PATH')) print("ODBCINI:", os.environ.get('ODBCINI')) print("ODBCSYSINI:", os.environ.get('ODBCSYSINI'))
如果发现LD_LIBRARY_PATH被修改,可在导入Pandas前手动设置正确的路径:
import os os.environ['LD_LIBRARY_PATH'] = '/usr/lib/x86_64-linux-gnu/odbc:' + os.environ.get('LD_LIBRARY_PATH', '') import pandas import pyodbc
2. 连接字符串中直接指定驱动绝对路径
放弃使用驱动名称,直接在连接字符串里写驱动的绝对路径,同时注意报错中的libmyodbc8w.so是宽字符版本,若系统中只有非宽字符版(libmyodbc8.so),可直接替换:
conn_str = ( "DRIVER=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8.so;" "SERVER=localhost;" "DATABASE=your_database;" "UID=your_username;" "PWD=your_password;" ) import pyodbc conn = pyodbc.connect(conn_str)
如果系统中确实没有libmyodbc8w.so,可创建软链接指向现有驱动:
sudo ln -s /usr/lib/x86_64-linux-gnu/odbc/libmyodbc8.so /usr/lib/x86_64-linux-gnu/odbc/libmyodbc8w.so
3. 检查Pandas与系统库的冲突
Ubuntu 22.04的libgfortran版本为12,而Pandas 2.1.2依赖的库可能与系统版本存在冲突,导致动态链接器加载异常。用ldd命令检查依赖:
# 检查Pandas核心库依赖 ldd $(python -c "import pandas; print(pandas.__file__)")/../_libs/libpandas.so # 检查PyODBC依赖 ldd $(python -c "import pyodbc; print(pyodbc.__file__)")
若发现缺失或冲突的库,可手动安装对应版本的依赖包,或在导入Pandas前设置LD_PRELOAD加载正确的库:
import os os.environ['LD_PRELOAD'] = '/usr/lib/x86_64-linux-gnu/libgfortran.so.5' # 根据实际缺失的库调整 import pandas import pyodbc
4. 手动通过DriverManager加载驱动
绕过系统默认的ODBC驱动管理器,直接用PyODBC的DriverManager加载指定驱动:
import pyodbc # 直接加载驱动文件 driver = pyodbc.DriverManager('/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8.so') # 建立连接 conn = driver.connect('SERVER=localhost;DATABASE=your_database;UID=your_username;PWD=your_password')
内容的提问来源于stack exchange,提问作者Peter Southland

