使用c c 擴充套件python

2021-09-08 22:19:42 字數 4078 閱讀 8326

用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,int

i2)#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,int

i2)

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 檔案內容:

class

testmode

;

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