当需要采用调用c++的程序的时候,需要对原有的数据加一个extern "C"封装一下即可.
采用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
先来一个网上随便都能找得到的例子吧:先来一个test.c
在来一个test.h:
然后将其编译成.so文件:
最后在python文件里面调用:
然后在终端运行:
当然了,ctypes不是这样简单的模块,否则也不会放到标准库里面去
(未完待续...)
公司有个业务是使用python脚本调用.so文件,但是有时候so文件内部发生错误,python就直接崩溃了,无任何提示信息,所以很不方便找错误原因.
使用 gdb 可以看到更详细的一些信息,其使用方式如下:
ulimit -c 是查看创建的核心转储的最大大小,这里为0,是需要修改的,可以将其改成不限制大小的 unlimited .
cat /proc/sys/kernel/core_pattern 这一步我的理解是查看到时候生成的缓存文件存储名称,这里为 core ,表示其会在当前目录下生成一个名为core的缓存文件,但是为了使其更加通用,可以修改一下其路径和名称格式.
若执行的时候没有 gdb ,可以执行 apt-get install gdb 安装.
应该可以的.
关键是你要确定.a或.so是用C或C++编写的.
还有就是你要清楚地知道调用方法的接口.
用这下面的方式来调用
import ctypes
c = ctypes.cdll.LoadLibrary('xxx.so')
c.xxx(para)
以上就是土嘎嘎小编为大家整理的pythonso函数名相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!