使用c/c++扩展python
用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的更多相关文章
- 用 C 扩展 python
本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...
- 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments
使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...
- C语言扩展Python模块
1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \ C/C++中调用python文件. #include ...
- C扩展Python
基本想法: 先看中文小介绍,再看英文详细文档. 1. 参考 首先参考THIS, IBM的工程师好像出了好多这样的文章啊,而且每次看到时间戳,我都想戳自己- -! 2. ERROR 可能遇到错误: fa ...
- 扩展Python模块系列(三)----参数解析与结果封装
在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- 扩展Python模块系列(一)----开发环境配置
本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python ...
- 扩展Python模块系列(四)----引用计数问题的处理
承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...
- 扩展Python模块系列(五)----异常和错误处理
在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...
随机推荐
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
- C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁
系列文章 C#开发奇技淫巧一:调试windows系统服务 C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁 程序目录的整理 ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- CSS样式表分类
1.内联样式表 <p style="font-size:11px;">内联样式表</p> 2.内嵌样式表 写在head标签里 <style typ ...
- construction const parameter问题 构造函数const引用参数问题
工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...
- 初学者--bootstrap(六)组件中的字体图标----在路上(9)
组件---字体图标 无数可复用的组件,包括字体图标.下拉菜单.导航.警告框.弹出框等更多功能. 1.如何使用: 出于性能的考虑,所有图标都需要一个基类和对应每个图标的类.把下面的代码放在 ...
- CodeSmith模板代码生成实战详解
前言 公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的.然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉.为了尽可能的在结构层避免出现这种混乱的现象,我 ...
- Android 开发环境在 Windows7 下的部署安装
Android SDK Android SDK 为 Android 应用的开发.测试和调试提了必要的API库和开发工具. ADT Bundle 下载 如果你是一个android 开发新手,推荐你下载使 ...
- sorl6.0+jetty+mysql搭建solr服务
1.下载solr 官网:http://lucene.apache.org/solr/ 2.目录结构如下 3.启动solr(默认使用jetty部署) 在path路径下将 bin文件夹对应的目录加入,然后 ...
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.接下来我们利用一个简单的.NET Core控 ...