python loandlibrary加载so 错误

Python09

python loandlibrary加载so 错误,第1张

$ python -V

python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

ldd是列出动态库依赖关系:

$ ldd /usr/local/bin/python3.6linux-vdso.so.1 = (0x00007fffecbba000)libpython3.6m.so.1.0 = not foundlibpthread.so.0 = /usr/lib64/libpthread.so.0 (0x00007fe1400ff000)libdl.so.2 = /usr/lib64/libdl.so.2 (0x00007fe13fefb000)libutil.so.1 = /usr/lib64/libutil.so.1 (0x00007fe13fcf8000)libm.so.6 = /usr/lib64/libm.so.6 (0x00007fe13f9f6000)libc.so.6 = /usr/lib64/libc.so.6 (0x00007fe13f628000)/lib64/ld-linux-x86-64.so.2 (0x00007fe14031b000)

查找动态库:

$ find / -name 'libpython3.6m.so.1.0'/root/Python-3.6.9/libpython3.6m.so.1.0/usr/local/lib/libpython3.6m.so.1.0

(2)将libpython3.6m.so.1.0文件路径的目录添加到/etc/ld.so.conf :

$ vim /etc/ld.so.conf 文件末尾新添加一行,/usr/local/lib/

(3)保存,使得修改生效:

$ ldconfig

ps:下面看下python中使用动态库的方法

首先,创建一个简单的动态库

编程生成dll.so: gcc -fPIC -O2 -shared dll.c -o dll.so

C文件:dll.c 如下

#include stdio.hstruct param { int aint bchar cfloat fint arr[3]}void print0(struct param arg){ printf("in print:\n")printf("a: %d\n", arg.a)printf("b: %d\n", arg.b)printf("c: %c\n", arg.c)printf("f: %f\n", arg.f)printf("arr: %d %d %d\n", arg.arr[0], arg.arr[1], arg.arr[2])}void print2(struct param *arg){ printf("in print2 :\n")printf("a: %d\n", arg-a)printf("b: %d\n", arg-b)printf("c: %c\n", arg-c)printf("f: %f\n", arg-f)printf("arr: %d %d %d\n", arg-arr[0], arg-arr[1], arg-arr[2])}void print3(int a){ printf("in print3:\n")printf("a: %d\n", a)}

python定义传给动态库的结构体

from ctypes import *class ss(Structure): _fields_ = [ ("a", c_int), ("b", c_int), ("c", c_char), ("f", c_float), ("arr", c_int*3), //定义数组 ]

python 使用dll.so实例

#加载动态库fileName = "/home/primax/Desktop/Work/Test/python/dll.so"lib = cdll.LoadLibrary(fileName)#定义变量param = ss()#给结构体赋值param.a = 1param.b = 2param.c = 'a'param.f = 1.2345param.arr[0] = 0param.arr[1] = 1param.arr[2] = 2lib.print0(param)lib.print3(2)#传指针 pointer取指针lib.print2(pointer(param))

总结

到此这篇关于浅析python 动态库m.so.1.0错误问题的文章就介绍到这了,更多相关python m.so.1.0内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关资源:浅析python动态库m.so.1.0错误问题_libpython3.6m.so.1.0-其它...

当需要采用调用c++的程序的时候,需要对原有的数据加一个extern "C"封装一下即可。

采用g++编译的代码也需要的,原因可能是因为c++编译器编译后的二进制so文件中,对c++的函数进行了重新的命名导致的。

extern "C" {

Foo* Foo_new(){ return new Foo()}

void Foo_bar(Foo* foo){ foo->bar()}

}

以下两个网页又更详细的介绍

http://blog.waterlin.org/articles/using-python-ctypes-to-link-cpp-library.html

http://stackoverflow.com/questions/145270/calling-c-c-from-python

最后需要补充的一个问题是:当我调用so文件的时候,会发生一个有趣的现象:

我把python放到streaming找运行的时候,发现streaming始终查找不到so,但是数据却是被上传到hadoop的对应的work目录下。

后来定位到原因:

是python加载动态库方面是默认从系统lib库上查找库文件。

我的目录在当前目录下,所以需要从libdy.so变为./libdy.so

先来一个网上随便都能找得到的例子吧:先来一个test.c

在来一个test.h:

然后将其编译成.so文件:

最后在python文件里面调用:

然后在终端运行:

嗯,python2的这个数字精度的bug也是醉了

当然了,ctypes不是这样简单的模块,否则也不会放到标准库里面去

(未完待续。。。)