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 ...