URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 2 » Pyrex与C++混合编程
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
Pyrex与C++混合编程
Author: ybeetle    Posted: 2006-08-29 14:34    Length: 4,754 byte(s)
[Original] [Print] [Top]
教程代码在这里下:
http://wiki.woodpecker.org.cn/moin/Pyrex


Pyrex与C++混合编程

以前python想用C++混合编程只能通过
Boost 或 Swig 或是 DIY ,不过这三种方法都有些麻烦,不易控制与扩展。

其实高版本的Pyrex可以与C++混合编程,不过中文社区里好像没有介绍,这也是我写这篇教程的原因。

准备的条件:
1. Python2.4安装
2. Pyrex安装必须是版本 Pyrex-0.9.4.1 才可以与C++编译
3. Dev-C++ 编译器 (版本最好是 4.9.9.2或以上) Linux 下用 g++ 就行
4. 如果windows下必须要先修正 Python24.lib (在我的例程附件中带有修正后的 Python24.lib 文件)

修正PythonXX.lib 方法如下:
1.拷贝python24.dll 到 C:Python24libs 目录下面
2.在命令行模式下,转到Python 的lib 目录下面
3.运行下面命令:
pexports python24.dll >python24.def
dlltool --dllname python24.dll --def python24.def --output-lib python24.lib

Python24.dll 在 C:WINNTsystem32python24.dll 下面。

上面的条件要先弄好才能开始玩,要不然别怪我教程不对。




只是编译有C++合成的项目不能用 setup.py 的方法,要手动编译:
假如我的pyrex 文件名是 test.pyx 像这样:

python pyrexc test.pyx (pyrexc文件在 C:Python24scripts 下面,要把这个目录在环境变量里设一下。或是复制到你用的目录里)

g++ -c test.c -mno-cygwin -mdll -IC:Python24include
g++ -mno-cygwin -shared -s test.o -LC:Python24libs -lpython24 -o test.pyd

就能通过编绎。



先编写一个C++文件:

///////////////////////////////////////////////////////////////////
// in.h


class AAA{
int num33;
public:

AAA(){
this->num33 = 10;
}

int getNum(){
return this->num33;
}

void setNum(int n222){
this->num33 = n222;
}

};




// 这是创造类的函数
AAA* NewAAA(){
return new AAA();
}

// 这是析构函数
void DelAAA(void *o){
AAA* s = (AAA*)o;
delete(s);
}


///////////////////////////////////////////////////////////////////


再编写test.pyx 文件将类包含进来

##################################################################
# test.pyx


# 通过 cdef extern 把类在头部声名一次
# 因为C++ class 与 struct 有兼容性所以把类当成 struct 就搞定
cdef extern from "in.h":
ctypedef struct AAA:
int (* getNum)()
void (* setNum)(int n222)
AAA* NewAAA()
void DelAAA(void *o)


cdef class PySomeClass:
cdef AAA *thisptr

def __new__(self):
self.thisptr = NewAAA()

def __dealloc__(self):
DelAAA(self.thisptr)

def getNum(self):
return self.thisptr[0].getNum()

def setNum(self,n):
self.thisptr[0].setNum(n)


##################################################################


运行

import test
print test
print dir(test)
A = test.PySomeClass()
A.setNum(99777)
print A.getNum()

输出:
<module 'test' from 'D:DTempPY__~1 est.pyd'>
['PySomeClass', '__builtins__', '__doc__', '__file__', '__name__']
99777

现在基本上就算是研制成功了。。


讲下主要原理:
Pyrex最初的设计主要是用来也C语言合成使用的工具,也只支持定义一个 struct 的外部声名。
但在Pyrex声名extern的东西就会原封不运的转换成 C 代码。
C++ 的 class 与 struct 其实是一回事情,在C++编译器与C 混合编译的时侯就一起编译了。




欢迎Python 爱好者一起交流:
我的网名 ybeetle 电邮: 6b6@21cn.com



          2006-08-17

[Original] [Print] [Top]
« Previous thread
Q:如何统计文件的大小
Python 编 程
2
Next thread »
我有个关于ConfigParser的set方法的问题。急,在线等。
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:10:53, cost 0.047062873840332 ms.