將c、c++代碼包裝成python代碼

如果要在Python中包裝現有的C或C ++功能,有很多選擇,這裏只記錄最值得推薦的方式,SWIG被Subversion, wxPython, Xapian等項目使用。值得一提的是,Google也使用SWIG。


用SWIG包裝Python代碼

SWIG本質上是一種宏語言,可以植入C代碼,並且可以爲你選擇的語言(python)生成包裝器代碼。

SWIG包裝“ hello”程序需要三件事。

第一步,生成文件
 swig -python -c++ -o _swigdemo_module.cc swigdemo.i
 python setup.py build_ext --inplace
  • 首先,運行SWIG生成C代碼擴展;
  • 然後,setup.py build 以實際構建它。
第二步,構建SWIG包裝文件“ swigdemo.i”

在這種情況下,它可能非常簡單:

%module swigdemo

%{
#include <stdlib.h>
#include "hello.h"
%}

%include "hello.h"
  • %module指定要從該包裝文件生成的模塊的名稱;
  • %{%}之間的代碼按原樣放置在C輸出文件中;在這種情況下,它僅包含兩個頭文件。
  • 最後一行%include只是說“針對此頭文件中的聲明構建接口”。
第三步,構建setup.py文件
from distutils.core import setup, Extension

extension_mod = Extension("_swigdemo", ["_swigdemo_module.cc", "hello.c"])

setup(name = "swigdemo", ext_modules=[extension_mod])

現在,當我們運行“ make”時,swig將生成_swigdemo_module.cc文件以及“ swigdemo.py”文件。然後,setup.py將兩個C文件一起編譯到一個共享庫’_swigdemo'中,該庫由swigdemo.py導入;那麼用戶就可以“導入swigdemo”並直接訪問包裝模塊中的所有內容。


SWIG可以直接接受 .h 頭文件做爲接口描述文件。在有了接口描述文件後,就可以利用 swig 命令生成包裝代碼了,然後將包裝代碼編譯鏈接成可被其他語言調用的庫。


參考:
https://intermediate-and-advanced-software-carpentry.readthedocs.io/en/latest/c+±wrapping.html

https://segmentfault.com/a/1190000013219667

發佈了93 篇原創文章 · 獲贊 225 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章