用python脚本写应用比较方便,但有时候由于种种原因需要扩展python(比如给程序提供python接口等)。 之前一直想整理下,今天终于坐下来把这件事情给做了,这里记录下,也方便我以后查阅。

说明: 测试环境中操作系统为CentOS6.5_x64,python版本为2.6

直接调用动态库

1、编写模块动态库文代码

这里以求最大数为示例

代码(callTest1.cpp)如下:

extern "C"
{
int Max(int i1,int i2)
{
return (i1>i2)?i1:i2;
}
}

在bash中执行以下命令:

g++ -fPIC -shared -o libcallTest1.so callTest1.cpp

生成动态库文件libcallTest1.so

2、使用python调用动态库

可以通过ctypes调用动态库文件,具体如下:

#! /usr/bin/env python

from ctypes import *
import os so1 = CDLL(os.getcwd() + '/libcallTest1.so')
print so1.Max(1,3)

使用boost库扩展python

这种方式可以直接生成python模块,使用import操作直接导入即可。 当然使用这种方式,需要安装boost库,具体操作这里就不说了,不懂的朋友自己查下。

boost官网:http://www.boost.org/

1、模块代码如下:

文件名:boostCallTest1.cpp

文件内容:

int Max(int i1,int i2)
{
return (i1>i2)?i1:i2;
} #include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python; BOOST_PYTHON_MODULE(boostCallTest1)
{
def("Max",Max);
}

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扩展python

SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。

SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。

swig官网: http://www.swig.org/download.html

可以通过yum直接安装:

yum install swig

1、编写程序代码

文件名:swigCall.cpp

内容如下:

int Max(int i1,int i2)
{
return (i1>i2)?i1:i2;
}

2、编写接口文件

文件名:swigCall.i

内容如下:

%module swigCall
%{
extern int Max(int i1,int i2);
%} 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./ -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扩展python

SIP是从SWIG发展而来,专为Python调用C/C++模块使用的。 注意,这里的SIP和voip中的sip不是同一个东西,这里的sip是扩展python用的,voip中的sip是一个通信协议,不要搞混了。

注意:

需要安装python sip库;

1、编写c++模块

1.1 编写头文件

文件名: sipCall.h 文件内容:

class TestMode
{
public:
int Max(int i1,int i2);
};

1.2 编写模块内容

文件名:sipCall.cpp 文件内容:

#include "sipCall.h"  

int TestMode::Max(int i1,int i2)
{
return (i1>i2)?i1:i2;
}

2、编写接口文件

文件名:sipCall.sip 文件内容:

%Module TestMode

class TestMode {  

%TypeHeaderCode
#include "sipCall.h"
%End public:
int Max(int i1,int i2);
};

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.LIBDIR.append(".")
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
 

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2015/20150808_用c++扩展python.md

欢迎补充

使用c/c++扩展python的更多相关文章

  1. 用 C 扩展 python

    本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...

  2. 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

    使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...

  3. C语言扩展Python模块

    1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \  C/C++中调用python文件. #include ...

  4. C扩展Python

    基本想法: 先看中文小介绍,再看英文详细文档. 1. 参考 首先参考THIS, IBM的工程师好像出了好多这样的文章啊,而且每次看到时间戳,我都想戳自己- -! 2. ERROR 可能遇到错误: fa ...

  5. 扩展Python模块系列(三)----参数解析与结果封装

    在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...

  6. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  7. 扩展Python模块系列(一)----开发环境配置

    本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python ...

  8. 扩展Python模块系列(四)----引用计数问题的处理

    承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...

  9. 扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

随机推荐

  1. MVVM大比拼之AngularJS源码精析

    MVVM大比拼之AngularJS源码精析 简介 AngularJS的学习资源已经非常非常多了,AngularJS基础请直接看官网文档.这里推荐几个深度学习的资料: AngularJS学习笔记 作者: ...

  2. Flux 普及读本

    话说当时做 APP 时,三月不知肉味,再次将眼光投放前端,有种天上一天,地下一年的感觉. Flux 是一种思想 了解的最好方式当然是看Flux官方文档了.React 中文站点也能找到对应的翻译版本,但 ...

  3. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

  4. Spark核心作业调度和任务调度之DAGScheduler源码

    前言:本文是我学习Spark 源码与内部原理用,同时也希望能给新手一些帮助,入道不深,如有遗漏或错误的,请在原文评论或者发送至我的邮箱 tongzhenguotongzhenguo@gmail.com ...

  5. Vertica环境安装R-Lang包提示缺少libgfortran.so.1

    环境:RHEL 6.4 + Vertica 7.0.0-11.最终确认安装compat-libgfortran-41-4.1.2-39.el6.x86_64.rpm即可解决. # rpm -ivh v ...

  6. Java中的泛型 (上) - 基本概念和原理

    本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...

  7. WebComponent魔法堂:深究Custom Element 之 面向痛点编程

    前言  最近加入到新项目组负责前端技术预研和选型,一直偏向于以Polymer为代表的WebComponent技术线,于是查阅各类资料想说服老大向这方面靠,最后得到的结果是:"资料99%是英语 ...

  8. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 3

    原文地址:http://ddmvc4.codeplex.com/ 原文名称:Design and Develop a website using ASP.NET MVC 4, EF, Knockout ...

  9. 【译】Asp.net mvc 使用ITextSharp PDF to HTML (解决img标签问题)

    前言:因项目需求,需要将HTML代码转成PDF.大致上已经实现了,可以是发现使用ITextSharp(我现在的版本是5.5.9)的时候,img标签中的src只能跟绝对路径. 在百度上找了一个上午,有一 ...

  10. SPI 2分频MOSI实现

    module spi_25M(input clk,input rst_n,output reg sdin,output reg sclk,output reg cs);reg [7:0]cnt;reg ...