如何在 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