如何在 C/C++ 中封装 Python 对象?
为了在 Python 中封装现有的 C 或 C++ 功能,有许多可用的选项,它们是:使用 PyMethodDef 和 Py_InitModule 进行手动封装、SWIG、Pyrex、ctypes、SIP、Boost.Python 和 pybind1。
使用 SWIG 模块
让我们以一个 C 函数为例,然后使用SWIG将其调整到 Python。SWIG代表“简单包装器接口生成器”,它能够将 C 封装到多种语言中,例如 Python、PHP、TCL 等。
示例
考虑 example.c 文件中简单的阶乘函数 fact()。
/* 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
最后,我们必须将生成的 object 文件链接在一起以创建一个共享对象,它类似于 Windows 中的 dll 文件。使用上述命令,这将生成一个“_example.so”共享对象文件。现在我们准备通过导入它来测试 Python 包装器。
>>> import example >>> example.fact(5) 120
使用 Boost 库
现在,使用Boost.Python将 C++ 函数包装到 Python 中。
Boost.Python 库用于在 C/C++ 中包装 Python 对象。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);
}
根据上述设置,我们已经构建了一个共享库。现在,Python 可以看到生成的 DLL。这是一个 Python 会话示例 -
<<< import sample <<< print(sample.foo())
输出
Sample, function
通过使用这个基本的 foo 函数,我们已成功地将 C++ 函数共享到 Python。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP