使用RPATH解决ksycopg2库需要额外指定加载路径

使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值