导入pyarrow后pyodbc无法连接MySQL ODBC驱动问题求助
导入pyarrow后pyodbc无法找到MySQL ODBC驱动文件
我在一个预装了MySQL ODBC驱动、unixODBC及相关Python库的Docker容器中遇到了奇怪的问题:
正常场景:未导入pyarrow时连接正常
在全新Python进程中,直接使用pyodbc可以正常连接MySQL,isql也能正常工作:
sh-4.4# python Python 3.8.16 (default, May 31 2023, 12:44:21) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pyodbc >>> pyodbc.connect("DRIVER=MySQL ODBC 8.1 ANSI Driver;SERVER=host.docker.internal;PORT=3306;UID=root;PWD=shh") <pyodbc.Connection object at 0x7f6fd94dac70>
异常场景:导入pyarrow后连接失败
如果先导入pyarrow再尝试连接,会直接报错找不到驱动文件:
sh-4.4# python Python 3.8.16 (default, May 31 2023, 12:44:21) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pyarrow >>> import pyodbc >>> pyodbc.connect("DRIVER=MySQL ODBC 8.1 ANSI Driver;SERVER=host.docker.internal;PORT=3306;UID=root;PWD=shh") Traceback (most recent call last): File "<stdin>", line 1, in <module> pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc8a.so' : file not found (0) (SQLDriverConnect)")
即使直接指定驱动的绝对路径,错误依然相同:
sh-4.4# python Python 3.8.16 (default, May 31 2023, 12:44:21) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pyarrow >>> import pyodbc >>> pyodbc.connect("DRIVER=/usr/lib64/libmyodbc8a.so;SERVER=host.docker.internal;PORT=3306;UID=root;PWD=shh") Traceback (most recent call last): File "<stdin>", line 1, in <module> pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc8a.so' : file not found (0) (SQLDriverConnect)")
已做的排查工作
- 检查驱动依赖:用lddtree检查
/usr/lib64/libmyodbc8a.so的所有依赖,确认所有依赖库都存在且路径正确:
>>> import os >>> os.system('./lddtree.sh /usr/lib64/libmyodbc8a.so') libmyodbc8a.so => /usr/lib64/libmyodbc8a.soreadelf: /usr/lib64/libmyodbc8a.so: Warning: Section '.interp' was not dumped because it does not exist! (interpreter => none) readelf: /usr/lib64/libmyodbc8a.so: Warning: Section '.interp' was not dumped because it does not exist! libpthread.so.0 => /lib64/libpthread.so.0 libdl.so.2 => /lib64/libdl.so.2 libssl.so.1.1 => /lib64/libssl.so.1.1 libz.so.1 => /lib64/libz.so.1 libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 libresolv.so.2 => /lib64/libresolv.so.2 librt.so.1 => /lib64/librt.so.1 libm.so.6 => /lib64/libm.so.6 libodbcinst.so.2 => /lib64/libodbcinst.so.2 libltdl.so.7 => /lib64/libltdl.so.7 libstdc++.so.6 => /lib64/libstdc++.so.6 libgcc_s.so.1 => /lib64/libgcc_s.so.1 libc.so.6 => /lib64/libc.so.6 ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 0
- 升级依赖库:已将pyarrow(13.0.0)和pyodbc(4.0.39)升级到最新版本,问题依然存在。
- 对比其他驱动:容器中其他ODBC驱动未出现此问题。
- 参考类似问题:曾见过导入protobuf时出现类似错误,旧版pyarrow包含protobuf头文件但新版已移除,不确定是否相关。
我推测pyarrow在初始化过程中修改了某些环境变量或加载器配置,但不知道具体该从哪些方向深入排查,求进一步的调试建议。
内容的提问来源于stack exchange,提问作者Aron
相关产品推荐
相关产品推荐

