摘要:调用方式方式一基础篇这种方法叫做的扩展使用这样调用引用的头文件包裹函数,用来包裹需要转化为的函数,在方法前面加下划线。定义名称通常和文件名保持一致。执行命令在下,使用编译器生成对应的文件。
Python调用C++方式 方式一(基础篇)
这种方法叫做python的扩展
int great_function(int a) { return a + 1; }
使用python这样调用
>>> from great_module import great_function >>> great_function(2) 3
// great_module.c // 引用python的头文件 #includeint great_function(int a) { return a + 1; } // 包裹函数,用来包裹需要转化为python的函数,在方法前面加下划线。 static PyObject * _great_function(PyObject *self, PyObject *args) { int _a; int res; // 检查参数类型是否正确,python参数转化为c if (!PyArg_ParseTuple(args, "i", &_a)) return NULL; res = great_function(_a); return PyLong_FromLong(res); } // 定义的方法表,用于在python中查找 static PyMethodDef GreateModuleMethods[] = { { "great_function", _great_function, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} }; // 必须以module名前面加init定义该方法 PyMODINIT_FUNC initgreat_module(void) { (void) Py_InitModule("great_module", GreateModuleMethods); }
在Linux下面,则用gcc编译:
$ gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7/ -lpython2.7
gcc命令行参数:
-shared
生成一个共享对象,可以与其他对象接连成可执行文件
-fPIC
适用于动态链接,避免全局偏移表大小的限制,只能在某些机器上运行
在当前目录下得到great_module.so,同理可以在Python中直接使用。
方法二(使用SWIG)SWIG : Simplified Wrapper and Interface Generator调用c
不仅可以用于python,也可以用于其他java/perl/ruby/php/JavaScript/Go。
/* great_module.i */ %module great_module %{ int great_function(int a) { return a + 1; } %} int great_function(int a);
定义module名称通常和文件名保持一致。
%{%}包裹的部分是c语言代码,这段代码会原封不动的复制到mymodule_wrap.c
欲导出的函数签名列表。直接从头文件中复制过来即可
$ swig -c++ -python great_module.i
会生成对应的great_module_wrap.c和great_module.py文件
再执行:
$ g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成对应的_great_module.so文件,这时,我们就可以再python中直接调用了
from great_module import great_function print great_function(9) >>> 10调用c++
定义一个头文件,great_class.h
#ifndef GREAT_CLASS #define GREAT_CLASS class Great { private: int s; public: void setWall (int _s) {s = _s;}; int getWall() {return s;}; }; #endif
再定义一个great_class.i的swig配置文件,这里不用再写一遍SWIG的定义了,直接使用SWIG的%include指令;
在SWIG编译时要加-c++这个选项,生成的扩展名为cxx。
/* great_class.h */ %module great_class %{ #include "great_class.h" %} %include "great_class.h"
执行命令:
$ swig -c++ -python great_class.i
在Linux下,使用C++编译器g++
g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成对应的_great_class.so文件。现在可以直接在python中输入
import great_class c = great_class.Great() c.setWall(10) print c.getWall() >>> 10参考
知乎作者:Jerry Jho 链接
SWIG的官方文档SWIG Users Manual
GCC命令行选项
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41194.html
摘要:调用以回调函数地址为参数的函数这个主题就稍微绕一些了,也就是说在接口中,需要传入回调函数作为参数。这个问题在中也可以解决,并且回调函数可以用定义。代码代码很简单回调函数的传入参数为,返回参数也是。 项目中要对一个用 C 编写的 .so 库进行逻辑自测。这项工作,考虑到灵活性,我首先考虑用 Python 来完成。 研究了一些资料,采用 python 的 ctypes 来完成这项工作。已经...
摘要:可以在接口文件中直接引用库里的内容,大大方便接口文件的编写。使用库里的这里先介绍方式通过创建出来的数组是数组的直接代理,非常底层和高效,但是,它也和数组一样不安全,一样没有边界检查。对由于这种情况,可以使用库里的。 如果你也像我们一样,同时使用Python和C++,以获得两种语言的优势,一定也会希望寻找一种好的方式集成这两种语言,相比而言,让Python能够方便使用C++的库更加重要,...
摘要:整个过程还是比较清晰的,关键是要理解的工作方式,而不是想当然地认为调用了父类的方法。小结事实上,和父类没有实质性的关联。 super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如: class Animal(object): def __...
摘要:因为你可能需要在工作中与一些奇怪的人合作问题多线程使用。回答不允许真正意义上的多线程。在学习之前,很多人花了很多的时间在他们的多线程中遇到了瓶颈。 showImg(https://segmentfault.com/img/remote/1460000019609267); 介绍 随着人工智能、机器学习、深度学习的发展,这个领域也正在不断的进入人们的眼帘,并且带来了很多、很大的工作机会,...
摘要:使用抽象基类显示表示接口如果类的作用是定义接口,应该将其明确定义为抽象基类。此外,抽象基类可以作为其他类的唯一基类,混入类则决不能作为唯一的基类,除非这个混入类继承了另一个更具体的混入这种做法非常少见。 《流畅的Python》笔记本篇是面向对象惯用方法的第五篇,我们将继续讨论继承,重点说明两个方面:继承内置类型时的问题以及多重继承。概念比较多,较为枯燥。 1. 继承内置类型 内置类型...
阅读 3152·2021-11-22 14:45
阅读 3299·2019-08-29 13:11
阅读 2304·2019-08-29 12:31
阅读 920·2019-08-29 11:21
阅读 2989·2019-08-29 11:09
阅读 3613·2019-08-28 18:11
阅读 1417·2019-08-26 13:58
阅读 1270·2019-08-26 13:27