Python与C集成方法的初探_第1页
Python与C集成方法的初探_第2页
Python与C集成方法的初探_第3页
Python与C集成方法的初探_第4页
Python与C集成方法的初探_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 软件安装1、 Python-2.3.3.exe(注意:版本有关系,有些高版本有问题)2、 VC 6.0二、运行环境配置1、本文默认Python的安装目录为:C:/Python23;在VC IDE中Tools-Options-Directories配置Include files为:C:/Python23/include;Library files为:C:/Python23/libs;2、如需要Debug版本的要下载python23_d.lib和python23_d.dll这两个文件,也可以下载Python源码来编译获得,具体可查阅相应文档。三、C调用Python1、Test.c源码1 in

2、t main(int argc, char* argv)2 3 /初始化Python4 /在使用Python系统前,必须使用Py_Initialize对其5 /进行初始化。它会载入Python的内建模块并添加系统路6 /径到模块搜索路径中。这个函数没有返回值,检查系统7 /是否初始化成功需要使用Py_IsInitialized。8 PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;9 Py_Initialize();10 / 检查初始化是否成功11 if ( !Py_IsInitialized() )12 13 return -1;14 15 /添加当

3、前路径16 /把输入的字符串作为Python代码直接运行,返回017 /表示成功,-1表示有错。大多时候错误都是因为字符串18 /中有语法错误。19 PyRun_SimpleString(import sys);20 PyRun_SimpleString(sys.path.append(./);21 / 载入名为pytest的脚本22 pName = PyString_FromString(pytest);23 pModule = PyImport_Import(pName);24 if ( !pModule )25 26 printf(cant find pytest.py);27 getc

4、har();28 return -1;29 30 pDict = PyModule_GetDict(pModule);31 if ( !pDict )32 33 return -1;34 35 / 找出函数名为add的函数36 pFunc = PyDict_GetItemString(pDict, vcadd);37 if ( !pFunc | !PyCallable_Check(pFunc) )38 39 printf(cant find function vcadd);40 getchar();41 return -1;42 43 / 参数进栈44 *pArgs;45 pArgs = Py

5、Tuple_New(2);46 / PyObject* Py_BuildValue(char *format, .)47 / 把C+的变量转换成一个Python对象。当需要从48 / C+传递变量到Python时,就会使用这个函数。此函数49 / 有点类似C的printf,但格式不同。常用的格式有50 / s 表示字符串,51 / i 表示整型变量,52 / f 表示浮点数,53 / O 表示一个Python对象。54 PyTuple_SetItem(pArgs, 0, Py_BuildValue(l,3);55 PyTuple_SetItem(pArgs, 1, Py_BuildValue(

6、l,4);56 / 调用Python函数57 PyObject_CallObject(pFunc, pArgs);58 /下面这段是查找函数foo 并执行foo59 pFunc = PyDict_GetItemString(pDict, vcfoo);60 if ( !pFunc | !PyCallable_Check(pFunc) )61 62 printf(cant find function vcfoo);63 getchar();64 return -1;65 66 pArgs = PyTuple_New(1);67 PyTuple_SetItem(pArgs, 0, Py_Build

7、Value(l,2); /68 PyObject_CallObject(pFunc, pArgs);69 Py_DECREF(pName);70 Py_DECREF(pArgs);71 Py_DECREF(pModule);72 / 关闭Python73 Py_Finalize();74 return 0;75 2、 pytest.py源码76 def add(a,b):77 print in python function add78 print a = + str(a)79 print b = + str(b)80 print ret = + str(a+b)81 return3、运行设置

8、将pytest.py文件与C工程编译的exe文件存放同一目录下(具体的存放路径应该可以统一配置,在此不便描述),启动编译的exe文件后即可调用pytest.py文件的函数及执行结果。四、Python调用C1、建立一个目录,整个目录名中不要包含中文。在目录下建立 add.c,内容如下:82 #include ;83 static PyObject* add(PyObject *self, PyObject *args);84 /一定声明为static,把他们限制在这个文件范围里。 几乎所有的参数都是PyObject类型。 在python,每个东西都是object。85 static PyObje

9、ct* add(PyObject* self, PyObject* args)86 87 int x=0 ;88 int y=0;89 int z=0;90 if (! PyArg_ParseTuple(args, i|i, &x, &y)91 return NULL;92 /*第一个参数是self,这个是python用的, 每个函数都要有。我们暂时不管。args是一个参数列表。她把所有的参数都整合成一个string。所以 我们需要从这个string里来解析我们的参数。PyArg_ParseTuple来完成这个任务。第一个参数是args, 就是我们要转换的参数。第二个是格式符号。“s”代表是个

10、string。 从args里提取一个参数就写s, 两个的话就写s|s, 如果是一个string,一个int,就写s|i, 和printf差不多。第三个 参数就是提取出来的参数放置的真正位置。必须传递这个参数的地址。对于add, 他将提取两个参数。分别是x和y。*/93 z=x+y;94 return Py_BuildValue(i, z);95 /*调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。必须把他转换成PyObject, 让python认识。这个用Py_BuildValue 来完成。他是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_P

11、arseTuple的第二个参数一样, 是个格式化符号。第三个参数 是我们需要转换的参数。Py_BuildValue会把所有的返回只组装成一个tutple给python。*/96 97 static PyMethodDef addMethods =98 99 add, add, METH_VARARGS, Execute a shell command.,100 NULL, NULL, 0, NULL101 102 /*这个是一个c的结构。他来完成一个映射。 我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是python真正认识的。是python 里的方法名字。 第二个字段是python

12、里的这个方法名字的具体实现的函数名。 在python里调用add, 真正执行的是用c写的add函数。第三个字段是METH_VARARGS, 他告诉python,add是调用c函数来实现的。第四个字段是这个函数的说明。如果你在python里来help这个函数,将显示这个说明。相当于在python里的函数的文档说明。*/103 PyMODINIT_FUNC initadd()104 105 Py_InitModule(vince, addMethods);106 107 /*注意,这个函数的名字不能改动。 必须是init+模块名字。 我们的模块名字是add。所以这个函数是initadd()。这样p

13、ython在导入add 的模块时候,才会找到这个函数,并调用。这个函数调用Py_InitModule来将模块名字和映射表结合在一起。 他表示,add这个模块使用addMethods这个映射表。python应该这样导入我们的module的.*/然后建立setup.py这个文件,内容如下:108 #! /usr/bin/python109 from distutils.core import setup, Extension110 module1 = Extension(add, sources = add.c)111 setup (name = PackageName, version = 1.

14、0, description = This is a demo package, ext_modules = module1)在msdos下进入这个目录,输入命令setup.py build。 如果你能编译成功,到你所在目录的build/lib.win32-2.3下会发现add.pyd文件,将文件复制到你所需要的地方(与python同目录下,放在其他目录的话要配置环境变量),启动python,然后:112 D:/c;python113 Python 2.3.3 (#51, Dec 18 2003, 20:22:39) MSC v.1200 32 bit (Intel) on win32114

15、Type help, copyright, credits or license for more information.115 ; import add116 ; print dir(add)117 _doc_, _file_, _name_, add118 ; add.add(1,2)119 3120 ;2、C源码121 static PyObject* add(PyObject *self, PyObject *args)122 123 int x=0 ;124 int y=0;125 int z=0;126 if (!PyArg_ParseTuple(args, i|i, &x, &y)return NULL;127 z=x+y;128 return Py_BuildValue(i, z);129 130 static PyMethodDef addMethods =131 132 add, add, METH_VARARGS, Execute a shell command,Create by Vince.,133 NULL, NULL, 0, NULL134 135 PyMODINIT_FUNC initvince()136 137 Py_InitModule(vince,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论