新网创想网站建设,新征程启航

为企业提供网站建设、域名注册、服务器等服务

pythonso函数名,python的函数名

python 怎么调用so文件

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

目前成都创新互联公司已为上1000家的企业提供了网站建设、域名、虚拟主机、网站托管、服务器托管、企业网站设计、松原网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

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

extern "C" {

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

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

}

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

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

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

后来定位到原因:

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

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

Python 调用 so

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

在来一个test.h:

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

最后在python文件里面调用:

然后在终端运行:

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

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

(未完待续。。。)

使用gdb查看python段错误(Segmentation fault)

公司有个业务是使用python脚本调用.so文件,但是有时候so文件内部发生错误,python就直接崩溃了,无任何提示信息,所以很不方便找错误原因.

使用 gdb 可以看到更详细的一些信息,其使用方式如下:

ulimit -c 是查看创建的核心转储的最大大小,这里为0,是需要修改的,可以将其改成不限制大小的 unlimited .

cat /proc/sys/kernel/core_pattern 这一步我的理解是查看到时候生成的缓存文件存储名称,这里为 core ,表示其会在当前目录下生成一个名为core的缓存文件,但是为了使其更加通用,可以修改一下其路径和名称格式.

可以看到在 var/cores 目录下生成了一个 core.python.31796 文件,此时可以在刚才的运行目录下执行,下面的 which 前面是`符号,不是单引号

此时可以看到项目最终是在 #0 0x00007f89d8700960 in mkl_pds_lp64_ladj_mod_pardiso () from /usr/lib/libmkl_intel_thread.so 时发生了错误,这个时候可以输入 bt 查看更多,其从上到下是错误从底层到最外层的顺序.

若执行的时候没有 gdb ,可以执行 apt-get install gdb 安装.

还有就是,若查看的时候错误地方是 #0 0x00000000005406df in ?? () 这样的没有具体函数名的情况,这是因为so文件在编译时候没有链接符号到文件里面,需要在使用gcc编译的时候加上 -g

python可以调用.so或.a库吗

应该可以的。

关键是你要确定.a或.so是用C或C++编写的。

还有就是你要清楚地知道调用方法的接口。

用这下面的方式来调用

import ctypes

c = ctypes.cdll.LoadLibrary('xxx.so')

c.xxx(para)


当前名称:pythonso函数名,python的函数名
标题网址:http://wjwzjz.com/article/hchcpo.html
在线咨询
服务热线
服务热线:028-86922220
TOP