如何将Python对象包装在C/C++中

如何将Python对象包装在C/C++中

为了将现有的C或C++功能包装在Python中,有许多选项可用,包括:手动使用PyMethodDef和Py_InitModule进行包装、SWIG、Pyrex、ctypes、SIP、Boost.Python和pybind11。

使用SWIG模块

让我们以一个C函数为例,并使用 SWIG 将其转换为Python。SWIG代表”Simple Wrapper Interface Generator”,它能够将C语言包装成多种语言,如PythonPHP、TCL等。

示例

考虑一个简单的阶乘函数fact(),保存在example.c文件中。

/* File : example.c */

 #include <example.h>
// calculate factorial
 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }

头文件

int fact(int n);

接口文件

现在,为了将上述的C函数添加到Python语言中,你需要编写一个“接口文件”,这是SWIG的输入。

/* example.i */
%module example 
%{ /* Put header files here or function declarations like below */
extern int fact(int n); 
%} 

extern int fact(int n);

创建Python的封装器

通过简单地按照以下步骤,我们可以将C代码封装为一个Python模块。

>swig -python example.i

这将创建名为“example_wrap.c”和“example.py”的新文件。”example_wrap.c”文件包含了我们原始C代码的冗长版本,包含各种错误处理代码等等。”example.py”将被导入到我们的python脚本中。

之后执行以下命令:

>gcc -c example.c example_wrap.c \ -I/usr/local/include/python2.7

这将生成位置无关代码,通过编译“example_wrap.c”和“example.py”文件将其用于共享库中。注意:请将python2.7替换为您的Python版本。这将生成两个目标文件“example_wrap.o”和“example.o”。

>ld -shared example.o example_wrap.o -o _example.so

最后,我们需要将生成的目标文件链接在一起,创建一个等同于Windows中dll文件的共享对象。使用上述命令,这将生成一个名为“_example.so”的共享对象文件。现在我们可以通过导入它来测试Python包装器。

>>> import example 
>>> example.fact(5) 
120

使用Boost库

现在我们将一个C++函数包装为Python,使用 Boost.Python

Boost.Python库 用于将Python对象封装在C/C++中。Boost Python库是一个用于Python和C++接口的框架。它不需要使用任何特殊工具,就能够快速无缝地将C++类、函数和对象暴露给Python,反之亦然。

该库旨在非侵入性地包装C++接口,因此您根本不需要更改C++代码来进行封装。该库使用了高级元编程技术,简化了语法,使封装代码看起来像一种声明式接口定义语言(IDL)。

示例

让我们来看一个基本的包装器:我们在一个C++文件中有一个名为’foo’的函数。

char const* foo()
{
   return "Sample,function";
}

然后编写一个Boost.python包装器,将“foo”函数暴露给Python。

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(sample)
{
    using namespace boost::python;
    def("foo",foo);
}

从上面的设置中,我们已经构建了一个共享库。生成的DLL现在对Python可见。这是一个示例Python会话:

<<< import sample
<<< print(sample.foo())

输出

Sample, function

通过使用这个基本的 foo 函数,我们已经成功地将 C++ 函数共享给了 Python。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程