使用RPATH解决ksycopg2库需要额外指定加载路径
问题
LD_LIBRARY_PATH=/home/kingbase/lib:$LD_LIBRARY_PATH python -c 'import ksycopg2;print(ksycopg2.__version__)'
LD_LIBRARY_PATH这一长串开发者不友好,然而不添加LD路径就会找不到so报错:
python -c 'import ksycopg2;print(ksycopg2.__version__)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/whl/ksycopg2/__init__.py", line 51, in <module>
from ksycopg2._ksycopg import ( # noqa
ImportError: libpq.so.5: cannot open shared object file: No such file or directory
ImportError: libssl.so.10: cannot open shared object file: No such file or directory
解决
使用进程查看进程加载的so库信息:pmap -x -p <PID>
指定路径,以后不需要LD_LIBRARY_PATH
patchelf --set-rpath '$ORIGIN/' ./ksycopg2/libpq.so.5
patchelf --set-rpath '$ORIGIN/' ./ksycopg2/_ksycopg.cpython-310-x86_64-linux-gnu.so
检查一下so依赖:
readelf -d ./ksycopg2/_ksycopg.cpython-310-x86_64-linux-gnu.so
Dynamic section at offset 0x10f000 contains 27 entries:
标记 类型 名称/值
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/]
0x0000000000000001 (NEEDED) 共享库:[libpq.so.5]
0x0000000000000001 (NEEDED) 共享库:[libpthread.so.0]
0x0000000000000001 (NEEDED) 共享库:[libc.so.6]
0x000000000000000c (INIT) 0xf478
0x000000000000000d (FINI) 0x28878
0x0000000000000019 (INIT_ARRAY) 0x23a608
此时运行就解决了so库找不到的问题
python -c 'import ksycopg2;print(ksycopg2.__version__)'
2.8.5 (dt dec pq3 ext lo64)(for Python3.10 64bit KingbaseV008R006B0001, compiled on Wed Sep 28 15:15:13 2022, commit for *******)
国产软件生态真是一言难尽啊( ▼-▼ )
参考
https://blog.csdn.net/sinat_35178307/article/details/109164966
Linux下应用程序so库链接路径rpath修改【包含示例,超详细】 二
2.3. ksycopg2连接KingbaseES数据库配置
https://help.kingbase.com.cn/v8/development/client-interfaces/python/python-1.html#python