`
izuoyan
  • 浏览: 9265579 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Dev-Cpp/Mingw32 环境介绍(14)

阅读更多

Dev-Cpp/Mingw32 环境介绍(14)


上文回顾:

在上一文中,我们了解了如何在GCC下使用汇编语言。后来,由于个人生活环境的原因所以迟迟没有发布新的内容。当然,我这里并不想说一些不愉快的事情。不过,我没有想到居然中国还会有那么没有道德的人存在。由于,我同宿舍的一个温州人,邀请N个同学通宵看电影,影响我睡眠,造成我睡眠严重不足。更可恶的是对我进行人权侵犯!所以,就没有时间静下心来写东西了。今天刚让事情平息了一些,就想到了我的朋友你,所以马上就献上最新的文章。

第十九章 GCC下编写Python扩展

在这一章中,我向大家介绍一些有关Python语言的扩展编写的基础知识。

如果,你对Python了解了。那么你可以跳过这段,阅读后面的内容。如果不是,那么还是请您耐心了解一下Python吧。Python是一种解释性语言,而且历史悠久。他是跨平台,面向对象,使用C编写,可扩展的。他从设计一开始就是为面向对象设计的。所以,可以说,Python是一种不错的语言。有关Python的更多内容介绍,你可以看看我曾经写的另一篇Python的文章《略谈Python语言》。


Python可以使用C这一可移植的语言来进行扩展。而且,由于是用C写的。所以,扩展的速度可以和静态语言相比。所以,可以说会写Python的扩展可以大大的提高项目的运行效率。当然还有其他的好处。


不过,本文并不是介绍Python的语言的,也不是专门介绍用C扩展Python的。所以,就像我曾经所说的,我本系列的文章只是为你开启一扇扇的门。


下面我就开始我的的主题了。


在开始一切之前,请您先到 http://www.python.org 上下载最新的解释器,并安装。在我写本文的时候,最新的版本是Python 2.4.2 。这里有关Python的安装,我就不一步步的详细介绍了。


开始写程序吧!


首先,我先给出一组简单的Python代码吧。

第一个文件为add.py文件,这个文件将是会被导入的。

add.py

def add(x,y):

return(x+y)


第二个文件为main.py文件,这个文件将是会被执行的。

#main.py

import add

print add.add(256,512)


请将上面两个代码使用指定文件名(大小写也要注意,虽然在Win32下是不分大小写的)写入同一个目录下。然后,使用DOS终端在那个目录下输入 main.py 你将会看到他的输出为 768 。


下面我简单介绍一下两个代码的意思。

第一个文件中,定义了一个add函数,传入两个参数,分别命名为x和y。函数的作用是返回x+y的数值。

第二个文件中,我们首先导入了add.py这个文件,并把他的名字空间放到add空间中。然后,我们调用add中的add函数,并传入256和512。而且,最后在终端上显示add函数的返回值。


也许你会问,这不是介绍C的么?怎么又介绍Python了。其实,这个是为后面打下基础。


接着,我们试试用C在Python中实现add.py的功能吧。

//add.c

#include <Python.h>


static PyObject* add(PyObject *self, PyObject *args);


static PyObject* add(PyObject* self, PyObject* args)

{

int x=0 ;

int y=0;

int z=0;

if (! PyArg_ParseTuple(args, "i|i", &x, &y))

{

return NULL;

}


z=x+y;

return Py_BuildValue("i", z);

}


static PyMethodDef addMethods[] =

{

{"add", add, METH_VARARGS, "Execute a shell command."},

{NULL, NULL, 0, NULL}

};


PyMODINIT_FUNC initadd()

{

Py_InitModule("add", addMethods);

}


这段代码也许你会觉得有些糊涂,这是什么东西?下面我为你一一介绍。

首先的#include <python.h>是必须被导入的。这个在Python的安装目录的include目录中有。其次,我们定义了一个函数叫add。由于Python中的所有东西都是对象。所以,这里在C中,为了于Python通讯,C传给Python的,Python传给C的都是PyObject这个数据类型。下面PyArg_ParseTuple这一句,是将传入的数据转换成C类型的。Py_BuildValue这个函数是将C数据类型转化成Python的数据类型,并返回他。

接着,我们要告诉Python,我们C中的Python的函数有那些。所以,addMethods这个数据组,就是为了存放这些数据的。这个就是一个列表。最后那个initadd这个函数是在Python导入模块时初始化用的。必须存在。而且,比如以 init模块名的形式在命名。其中Py_InitModule函数,是告诉Python将addMethods这个列表所定义的内容,加入add这个名字空间中。

最后,我把代码在书写一遍。不过这次,我会用红色的部分标出套路的代码部分,也就是必须需要的地方。

#include <Python.h>


static PyObject* add(PyObject *self, PyObject *args);


static PyObject* add(PyObject* self, PyObject* args)

{

int x=0 ;

int y=0;

int z=0;

if (! PyArg_ParseTuple(args, "i|i", &x, &y))

{

return NULL;

}


z=x+y;

return Py_BuildValue("i", z);

}


static PyMethodDef addMethods[] =

{

{"add", add, METH_VARARGS, "Execute a shell command."},

{NULL, NULL, 0, NULL}

};


PyMODINIT_FUNC initadd()

{

Py_InitModule("add", addMethods);

}


最后,我们来把这个代码编译一下吧。你也许会问,既然是跨平台的,是否对于不同的操作系统,要使用不同的编译方式。答案是否定的。Python自带的编译脚本可以为你完成一切的编译过程。不过,你要在开始要把你的MinGW设置进环境变量中。具体可以看本系列文章第一章到第三章。

下面给出Python编译安装脚本的文件。

#!/usr/bin/python

#setup.py


from distutils.core import setup, Extension


module1 = Extension(name='add, sources = ['add.c'])


setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1])

这段代码是告诉Python如何来组成你的包。首先,第一句#!/usr/bin/python 是在BSD/Linux/Unix下告诉系统使用什么解释器运行代码在Win32下有和没有没什么区别。

Module1=Extension('mytest',sources=['add.c']是定义你第一个要编译扩展的信息。后面的setup函数,就是用来定义包的,其中在ext_modules中就在列表中加入了我们刚才定义的模块信息。这样,Python会更具你给的信息,更具不同的平台,操作系统自动的编译出合适的扩展文件。


在dos终端下输入setup.py build -cmingw32 如果没有错误,那么在编译后,你会在build目录中的子目录中找到add.pyd这个文件,这个就是Python的C扩展文件。把第一个例子中的add.py从目录中移除,并删除add.pyc这个文件(这个文件会在Python导入时自动生成,方便下次导入时快速执行和导入)。再将刚才编译的add.pyd放到该目录下。像刚才一样的运行,你看到了什么?和刚才一样的运行结果。对的。我这里的C扩展就是实现了刚才Python所定义的功能。怎么样是不是觉得还有很多不明白?如果你要深入Python的扩展编程,你可以看看Python的参考手册 Python/C API 这部分内容。下面列出一些Extension中一些参数的意义。


include_dirs 定义头文件的目录地址,默认情况下Python头文件目录的地址已经被定义了。

library_dirs 定义了库文件的目录地址,默认情况下Python的库文件目录也被包含了。

Libraries 定义在编译时要使用的库文件名,这个有点像GCC中在-l后面加的参数。


当然,还有其他很多参数。这里只是列出了常用的几个基本参数名和意义。希望我为你开启的门够宽敞。如果有兴趣,可以查看Python的参考手册。相信对你一定有很大的帮助。

好了,最后祝你在学习的过程中一切顺利,Good Luck。并且,希望有什么问题请你尽量提出来。


文外音:

就像我开始所说的,我由于生活环境的因素造成我迟迟没有写新的文章。这一点,是让我刚到非常亏欠于你的。不过,这也是最近一个月没有出文章的原因。前一阶段我也说过了,没有创意了。后来,偶然之间找到了中级篇的指导方向,所以马上就有了新文章的构思。希望我这篇文章能够让你们满意。谢谢你长久以来对我的支持。因为有了你,我才会有不懈的动力写下去。谢谢。如果你有任何的问题请到 http://blog.csdn.net/visioncat/ 上提出你的问题和建议。


STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

分享到:
评论

相关推荐

    Dev-Cpp/Mingw32环境介绍

    ### Dev-Cpp/Mingw32环境介绍 #### 一、概述 Dev-Cpp是一款流行的集成开发环境(IDE),主要用于C/C++程序的编写与编译。它基于Mingw32工具集,该工具集提供了针对Windows平台的GCC编译器及一系列支持工具。本文...

    Dev-Cpp 5.6.1 MinGW 4.8.1 Setup

    Dev-Cpp 5.6.1 MinGW 4.8.1 Setup 是一款集成开发环境(IDE),专门针对C和C++编程语言设计。这款软件是初学者和专业程序员的理想选择,因为它提供了一个轻量级但功能齐全的开发平台。在深入探讨其特点之前,我们先...

    Dev-Cpp 5.4.0 MinGW 4.7.2 Setup

    **Dev-Cpp 5.4.0 MinGW 4.7.2 Setup** 是一个针对C和C++编程语言的集成开发环境(IDE),专为初学者和专业开发者设计。这个版本结合了Dev-Cpp IDE与MinGW编译器套件,其中MinGW是Minimalist GNU for Windows的缩写,...

    Dev-Cpp 5.6.0 MinGW 4.8.1 Setup.exe

    Dev-Cpp 5.6.0 MinGW 4.8.1 Setup.exe Dev-Cpp 5.6.0 MinGW 4.8.1 Setup.exe Dev-Cpp 5.6.0 MinGW 4.8.1 Setup.exe Dev-Cpp 5.6.0 MinGW 4.8.1 Setup.exe

    Dev-Cpp 5.4.1 MinGW 4.7.2 Setup 的基础框架

    Dev-Cpp 5.4.1 MinGW 4.7.2 Setup &lt;---- Dev-Cpp 5.4.1 MinGW 4.7.2 Setup 是一款C++ 的编程软件 一下是C++的基础框架: #include using namespace std; int main(){ //这里可以填 printf, cout, int, cin, ...

    Dev-Cpp 5.4.2 MinGW 4.7.2 32位版本 32bit IDE C++编程工具 ORWELL c++ 2013年6月更新

    Dev-C++使用MingW32/GCC编译器,遵循C++ 11标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示的,以减少编辑错误,还有完善的...

    Dev-Cpp5.4.1MinGW4.7Setup

    Dev-Cpp5.4.1MinGW4.7Setup是一个针对C/C++编程语言的集成开发环境(IDE),尤其适用于Windows平台的软件开发。这个安装程序包含两个关键组件:Dev-C++ IDE和MinGW(Minimalist GNU for Windows)编译器套件。 Dev-...

    Dev-Cpp_5.6.1_MinGW_4.8.1 x86

    Dev-Cpp 5.6.1 自带MinGW 4.8.1 x86版本,可以在windows 10 x64下正常的编译和调试32位C语言程序。请不要和其他Dev-Cpp版本同时安装,那样会无法正常使用。

    Dev-Cpp 5.5.3 MinGW 4.7.2

    Dev-Cpp 5.5.3 MinGW 4.7.2是一款针对C++编程的集成开发环境(IDE),尤其适合初学者和专业开发者。这个版本的Dev-C++结合了MinGW(Minimalist GNU for Windows)编译器系统,该系统是GNU Compiler Collection (GCC)...

    Dev-Cpp 5.3.0.1 MinGW 4.7.0 Setup.exe

    Dev-Cpp 5.3.0.1 MinGW 4.7.0 Setup.exe,适用于各种ACM,OI,OJ,大学生程设竞赛,最常用算法程序竞赛IDE,Mingw 4.7.0

    Dev-Cpp 5.4.0 MinGW 4.7.2.zip

    《Dev-Cpp 5.4.0 MinGW 4.7.2:C/C++编程者的得力助手》 在编程领域,选择一个合适的集成开发环境(IDE)至关重要,尤其对于初学者和参赛者而言。Dev-Cpp 5.4.0 MinGW 4.7.2便是这样一款专为C/C++编程设计的IDE,它...

    Dev-Cpp 5.3.0.4 MinGW 4.7.0 Setup

    - MinGW仅支持32位Windows系统,而MinGW-w64则支持32位和64位Windows系统。如果你需要在64位Windows上开发,可能需要寻找包含MinGW-w64的IDE解决方案。 总的来说,Dev-Cpp 5.3.0.4 MinGW 4.7.0 Setup 提供了一个...

    Dev-Cpp 5.5.1 MinGW 4.7.2 Setup

    Dev-Cpp 5.5.1 MinGW 4.7.2 Setup 能开发c++,也能开发c语言。 支持win7 的64位啊!

    Dev-Cpp 5.5.3 MinGW 4.7.2 Setup

    Dev-Cpp 5.5.3 MinGW 4.7.2 Setup 是一个集成开发环境(IDE)的安装程序,专为C++编程语言设计。这个版本是针对初学者和专业开发者的一个轻量级选择,它包含了一套完整的工具链,使用户能够编写、编译、调试C++代码...

    Dev-Cpp.rar

    《Dev-Cpp:轻量级C++开发环境的探索与应用》 Dev-Cpp是一款针对初学者和专业开发者设计的轻量级C++集成开发环境(IDE),它以其小巧、易用的特点,成为了许多程序员的首选。不同于体积庞大的Visual Studio(VS)或...

    Dev-cpp安装包

    Dev-Cpp是一款集成开发环境(IDE),主要用于C和C++编程。这个安装包"Dev-Cpp 5.6.0 MinGW 4.8.1 Setup.exe"包含了Dev-Cpp的完整版本,以及其依赖的MinGW(Minimalist GNU for Windows)编译器套件,版本为4.8.1。在...

    Dev-Cpp_5.11 安装包.zip

    Dev-Cpp是一款经典的开源C++集成开发环境(IDE),它为程序员提供了编写、编译、调试C++程序所需的所有工具。这个"Dev-Cpp_5.11 安装包.zip"文件包含了版本5.11的安装程序,是Windows平台上用户友好的编程工具之一,...

    Dev-Cpp 5.9.2 TDM-GCC 4.8.1 Setup.zip

    Dev-Cpp 5.9.2 TDM-GCC 4.8.1 是一个集成开发环境(IDE),专为C++编程设计。这个版本的Dev-Cpp包含了TDM-GCC编译器,这是一个针对Windows平台优化的GCC(GNU Compiler Collection)版本。在本篇文章中,我们将深入...

    C/C++IDE集成开发环境 Dev-Cpp 5.5.2 MinGW 4.7.2

    总的来说,Dev-Cpp 5.5.2 MinGW 4.7.2是一个强大的C/C++开发工具,尤其适合初学者和对性能有要求的专业开发者,它提供了全面的开发环境和最新的语言特性支持。通过这款IDE,开发者可以更高效地进行C++编程,体验现代...

Global site tag (gtag.js) - Google Analytics