用python指令碼寫應用比較方便,但有時候由於種種原因需要擴充套件python(比如給程式提供python介面等)。 之前一直想整理下,今天終於坐下來把這件事情給做了,這裡記錄下,也方便我以後查閱。
說明: 測試環境中作業系統為centos6.5_x64,python版本為2.6
1、編寫模組動態庫文**
這裡以求最大數為示例
**(calltest1.cpp)如下:
extern"c"}
在bash中執行以下命令:
g++ -fpic -shared -o libcalltest1.so calltest1.cpp
生成動態庫檔案libcalltest1.so
2、使用python呼叫動態庫
可以通過ctypes呼叫動態庫檔案,具體如下:
#! /usr/bin/env python
from ctypes import *
import
osso1 = cdll(os.getcwd() + '
/libcalltest1.so')
print so1.max(1,3)
這種方式可以直接生成python模組,使用import操作直接匯入即可。 當然使用這種方式,需要安裝boost庫,具體操作這裡就不說了,不懂的朋友自己查下。
boost官網:
1、模組**如下:
檔名:boostcalltest1.cpp
檔案內容:
int max(int i1,inti2)#include
#include
using
namespace
boost::python;
boost_python_module(boostcalltest1)
2、編寫模組編譯指令碼
檔名: setup.py
檔案內容:
#!/usr/bin/env python
from distutils.core import
setup
from distutils.extension import
extension
setup(name="
packagename",
ext_modules=[
extension(
"boostcalltest1
", ["
boostcalltest1.cpp"],
libraries = ["
boost_python"])
])
3、編譯模組並測試
編譯模組:
python setup.py build
會在build目錄產生boostcalltest1.so檔案,進入該目錄,可如下使用:
>>> import boostcalltest1
>>> boostcalltest1.max(1,3)
3
swig是個幫助使用c或者c++編寫的軟體能與其它各種高階程式語言進行嵌入聯接的開發工具。
swig能應用於各種不同型別的語言包括常用指令碼編譯語言例如perl, php, python, tcl, ruby and php。
swig官網:
可以通過yum直接安裝:
yum install swig
1、編寫程式**
檔名:swigcall.cpp
內容如下:
int max(int i1,inti2)
2、編寫介面檔案
檔名:swigcall.i
內容如下:
%module swigcall
%extern int max(int i1,int i2);
3、編寫makefile檔案
內容如下:
all:make
swigcall
swigcall:
swig -python -c++swigcall.i
g++ -c swigcall.cpp swigcall_wrap.cxx -i/usr/include/python2.7/ -fpic
g++ -shared swigcall.o swigcall_wrap.o -o _swigcall.so
clean:
rm -f swigcall_wrap.c*
rm -f *.py*
rm -f *.so
rm -f *.o
注意:swig命令中要使用-c++引數編譯c++**
使用如下:
>>> import swigcall
>>> swigcall.max(1,5)
5>>>
sip是從swig發展而來,專為python呼叫c/c++模組使用的。 注意,這裡的sip和voip中的sip不是同乙個東西,這裡的sip是擴充套件python用的,voip中的sip是乙個通訊協議,不要搞混了。
注意:需要安裝python sip庫;
1、編寫c++模組
1.1 編寫標頭檔案
檔名: sipcall.h 檔案內容:
classtestmode
;
1.2 編寫模組內容
檔名:sipcall.cpp 檔案內容:
#include "sipcall.h
"int testmode::max(int i1,int
i2)
2、編寫介面檔案
檔名:sipcall.sip 檔案內容:
%module testmode
class testmode ;
3、生存靜態庫
這裡用指令碼實現,檔名稱:genlib.sh
檔案內容:
#! /bin/bash
g++ -c -fpic sipcall.cpp
ar -crs libsipcall.a sipcall.o
4、編寫configure檔案
該指令碼用於生成makefile,內容如下:
#! /usr/bin/env python
import
os
import
sipconfig
build_file = "
sipcall.sbf
"config =sipconfig.configuration()
cmd = "
".join([config.sip_bin, "
-c", "
.", "
-b", build_file, "
sipcall.sip
"])
os.system(cmd)
makefile =sipconfig.sipmodulemakefile(config, build_file)
makefile.extra_libs = ["
sipcall
"] ".
")
makefile.generate()
5、執行genlib.sh指令碼生成lib檔案;
6、執行configure.py指令碼生成makefile;
7、執行make生成模組檔案(so檔案);
8、python測試如下:
>>> import testmode
>>> dir(testmode)
['testmode', '__doc__', '__file__', '__name__', '__package__']
>>> s = testmode.testmode()
>>> s.max(1,3)
3
用c++擴充套件python.md
歡迎補充
C C 使用Lu擴充套件動態庫
lu程式設計 c c 使用lu擴充套件動態庫 1 說明 lu32.h,相信你會找到並正確使用這幾個檔案。用c c 編譯器建立乙個控制台應用程式,複製本文的例子 直接編譯執行即可。2 關於lu擴充套件動態庫的使用 lu擴充套件動態庫只有乙個輸出函式 lu擴充套件動態庫唯一的輸出函式 hlu lu32....
使用c語言擴充套件python
背景 我們工作中可能有時需要和第三方對接,而第三方提供的sdk可能是c語言或者c 編寫的,而我們程式使用的語言是python,這時候就需要使用python呼叫c庫 參考官方文件 編寫python擴充套件分三步 第一步 建立應用 使用c語言編寫具體的功能 如果sdk已經提供了並且不需要我們整合,則跳過...
使用C或C 擴充套件python
在python中,如果需要實現一些新的函式,型別物件及方法,可以通過c c 實現新的模組實現。乙個簡單的例子 如果要實現乙個module叫spam,希望實現乙個方法函式system,呼叫的是c的庫函式system import spam status spam.system ls l 首先建立乙個c...