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

更新於:2023年8月24日

360 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.