利用swig實現python呼叫C C 的方法

2021-07-09 01:10:32 字數 1934 閱讀 9724

python是一門語法簡單而且清晰的指令碼語言,不過執行效率比較低。簡單的說就是開發相對c/c++容易,但是執行效率不如c/c++,甚至有人稱之為執行效率最低的魚眼。如果可以將最重要的而且變化一般不大的運算邏輯用 c/c++實現,其他用python書寫,那就最好不過了。據說python底層就是用c實現的,因此這一想法也是可行的。目前來說,python呼叫c/c++有以下幾種方法:

1)  利用python提供的api呼叫c。主要方法是在c++檔案中借助python提供的標頭檔案python.h,對c/cpp函式進行封裝。然後將它編譯為乙個動態鏈結庫(乙個module)。最後在python檔案中將這個module 載入進去,就可以呼叫了。具體例子請見

2)  利用boost工具進行封裝。相對1)來說更為方便,但是和1)一樣都需要對原c**

進行破壞。具體例子請見

3)  利用ctypes。ctypes是python標準庫提供的呼叫動態鏈結庫的模組,相對1)2)來說不需要對源**

進行破壞,只需要對相應的c++資料型別進行python的轉換。但是據說對c/c++的支援不一定完整.

4)  利用swig工具。swig和boost一樣是乙個對c進行封裝的工具,但是和boost不一樣,它不需要對源**進行破壞,只需要新增乙個介面檔案對需要封裝的函式和類進行描述,swig會自動對c**封裝成乙個能被呼叫的module供python呼叫。

下面具體介紹一下swig的使用方法。剛才說了,swig和boost不一樣,它不用對源**進行破壞,只需要在外面多寫乙個介面檔案。假設有如下的cpp檔案需要封裝:

#include double my_variable = 3.0;

int fact(int n)

int my_mod(int x, int y)

char *get_time()

extern double my_variable;

extern int fact(int n);

extern int my_mod(int x, int y);

extern char *get_time();

這是python tutorial中的乙個例子。下面將具體介紹一下example.i這個檔案。

%module 後面的名字是被封裝的模組名稱。封裝口,python通過這個名稱引導程式。

%之間所新增的內容,一般包含此檔案需要的一些函式宣告和標頭檔案。

最後一部分,宣告了要封裝的函式和變數。

比較建議的寫法是,把要封裝的函式宣告部分寫成標頭檔案,假如為example.h,這樣介面檔案就非常簡單了:

%module example % 

%include"example.h"

為了編譯出乙個封裝的動態庫,依次執行:

$ swig -python -c++ example.i

$ g++ -c -fpic example_wrap.cxx -i/usr/local/include/python2.6

$ g++ -shared example_wrap.o -o _example.so

第一步的過程會生成example_wrap.cxx的檔案。因為現在是cpp檔案,所以編譯出來是個.cxx檔案和乙個example_wrap.py。如果是c的檔案,編譯後會出現乙個.c的檔案。這個檔案相當於將原cpp檔案進行了封裝,wrap了一層。後面兩步就是標準的生成動態鏈結庫的步驟了。這樣得到的動態鏈結庫就可以直接被python import了。

>>> import example

>>> example.fact(5)

120>>> example.my_mod(7,3)

1 >>> example.get_time()

'tue dec 11 23:01:07 2012'

>>>

利用PyCharm實現Python遠端除錯

python遠端除錯 一 介紹 python遠端除錯,即在遠端機器上執行python 在本地進行除錯。需要環境 python 除錯環境 pycharm 需要依賴 遠端和本地需要在python路徑安裝pycharm debug.egg 注 安裝egg包需要使用先安裝setuptools 二 安裝set...

python用swig調dll是個偽命題

只有自己寫的 生成的dll才可以通過swig來調,而且實際上調的也不是dll,而是.pyd檔案。也就是說用生成dll的 通過.i和 swap.cxx檔案一起生成乙個.pyd檔案,python在呼叫c 的函式的時候實際是鏈結的.pyd。沒有這個檔案是不能成功調dll的。用boost.python調dl...

利用SWIG將c 編譯成python可呼叫的包

基本操作可見官方指南 下面主要為實際複雜點的情況 windows10 huizi loc.cpp 檔案內容 typedef structlocation location huizi loc char file 256 huizi loc.h 檔案內容 typedef structlocation ...