收藏 分享(赏)

Python与C集成方法的初探.doc

上传人:hwpkd79526 文档编号:9425464 上传时间:2019-08-06 格式:DOC 页数:5 大小:53KB
下载 相关 举报
Python与C集成方法的初探.doc_第1页
第1页 / 共5页
Python与C集成方法的初探.doc_第2页
第2页 / 共5页
Python与C集成方法的初探.doc_第3页
第3页 / 共5页
Python与C集成方法的初探.doc_第4页
第4页 / 共5页
Python与C集成方法的初探.doc_第5页
第5页 / 共5页
亲,该文档总共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 调用

2、Python1、Test.c 源码 int main(int argc, char* argv) /初始化 Python /在使用 Python 系统前,必须使用 Py_Initialize 对其 /进行初始化。它会载入 Python 的内建模块并添加系统路 /径到模块搜索路径中。这个函数没有返回值,检查系统 /是否初始化成功需要使用 Py_IsInitialized。 PyObject *pName,*pModule,*pDict,*pFunc,*pArgs; Py_Initialize(); / 检查初始化是否成功 if ( !Py_IsInitialized() ) return -1;

3、 /添加当前路径 /把输入的字符串作为 Python 代码直接运行,返回0 /表示成功,-1表示有错。大多时候错误都是因为字符串 /中有语法错误。 PyRun_SimpleString(“import sys“); PyRun_SimpleString(“sys.path.append(./)“); / 载入名为 pytest 的脚本 pName = PyString_FromString(“pytest“); pModule = PyImport_Import(pName); if ( !pModule ) printf(“cant find pytest.py“); getchar();

4、return -1; pDict = PyModule_GetDict(pModule); if ( !pDict ) return -1; / 找出函数名为 add 的函数 pFunc = PyDict_GetItemString(pDict, “vcadd“); if ( !pFunc | !PyCallable_Check(pFunc) ) printf(“cant find function vcadd“); getchar(); return -1; / 参数进栈 *pArgs; pArgs = PyTuple_New(2); / PyObject* Py_BuildValue(ch

5、ar *format, .) / 把 C+的变量转换成一个 Python 对象。当需要从 / C+传递变量到 Python 时,就会使用这个函数。此函数 / 有点类似 C 的 printf,但格式不同。常用的格式有 / s 表示字符串, / i 表示整型变量, / f 表示浮点数, / O 表示一个 Python 对象。 PyTuple_SetItem(pArgs, 0, Py_BuildValue(“l“,3); PyTuple_SetItem(pArgs, 1, Py_BuildValue(“l“,4); / 调用 Python 函数 PyObject_CallObject(pFunc,

6、pArgs); /下面这段是查找函数 foo 并执行 foo pFunc = PyDict_GetItemString(pDict, “vcfoo“); if ( !pFunc | !PyCallable_Check(pFunc) ) printf(“cant find function vcfoo“); getchar(); return -1; pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue(“l“,2); / PyObject_CallObject(pFunc, pArgs); Py_DECREF(pName

7、); Py_DECREF(pArgs); Py_DECREF(pModule); / 关闭 Python Py_Finalize(); return 0; 2、 pytest.py 源码 def add(a,b): print “in python function add“ print “a = “ + str(a) print “b = “ + str(b) print “ret = “ + str(a+b) return3、运行设置将 pytest.py 文件与 C 工程编译的 exe 文件存放同一目录下(具体的存放路径应该可以统一配置,在此不便描述) ,启动编译的 exe 文件后即可调

8、用 pytest.py 文件的函数及执行结果。四、Python 调用 C1、建立一个目录,整个目录名中不要包含中文。在目录下建立 add.c,内容如下: #include ; static PyObject* add(PyObject *self, PyObject *args); /一定声明为 static,把他们限制在这个文件范围里。 几乎所有的参数都是PyObject 类型。 在 python,每个东西都是 object。 static PyObject* add(PyObject* self, PyObject* args) int x=0 ; int y=0; int z=0; if

9、 (! PyArg_ParseTuple(args, “i|i“, /*第一个参数是 self,这个是 python 用的, 每个函数都要有。我们暂时不管。args 是一个参数列表。她把所有的参数都整合成一个 string。所以 我们需要从这个string 里来解析我们的参数。PyArg_ParseTuple 来完成这个任务。第一个参数是args, 就是我们要转换的参数。第二个是格式符号。 “s”代表是个 string。 从 args里提取一个参数就写“s“, 两个的话就写“s|s“, 如果是一个 string,一个 int,就写“s|i“, 和 printf 差不多。第三个 参数就是提取出来

10、的参数放置的真正位置。必须传递这个参数的地址。对于 add, 他将提取两个参数。分别是 x 和 y。*/ z=x+y; return Py_BuildValue(“i“, z); /*调用完之后我们需要返回结果。这个结果是 c 的 type 或者是我们自己定义的类型。必须把他转换成 PyObject, 让 python 认识。这个用 Py_BuildValue 来完成。他是PyArg_ParseTuple 的逆过程。他的第一个参数和 PyArg_ParseTuple 的第二个参数一样, 是个格式化符号。第三个参数 是我们需要转换的参数。Py_BuildValue 会把所有的返回只组装成一个 t

11、utple 给 python。*/ static PyMethodDef addMethods = “add“, add, METH_VARARGS, “Execute a shell command.“, NULL, NULL, 0, NULL /*这个是一个 c 的结构。他来完成一个映射。 我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是 python 真正认识的。是 python 里的方法名字。 第二个字段是 python 里的这个方法名字的具体实现的函数名。 在 python 里调用 add, 真正执行的是用 c 写的 add 函数。第三个字段是 METH_VARARGS,

12、他告诉python,add 是调用 c 函数来实现的。第四个字段是这个函数的说明。如果你在python 里来 help 这个函数,将显示这个说明。相当于在 python 里的函数的文档说明。*/ PyMODINIT_FUNC initadd() Py_InitModule(“vince“, addMethods); /*注意,这个函数的名字不能改动。 必须是 init+模块名字。 我们的模块名字是add。所以这个函数是 initadd()。这样 python 在导入 add 的模块时候,才会找到这个函数,并调用。这个函数调用 Py_InitModule 来将模块名字和映射表结合在一起。 他表示

13、,add 这个模块使用 addMethods 这个映射表。python 应该这样导入我们的module 的.*/然后建立 setup.py 这个文件,内容如下: #! /usr/bin/python from distutils.core import setup, Extension module1 = Extension(add, sources = add.c) setup (name = PackageName, version = 1.0, description = This is a demo package, ext_modules = module1)在 msdos 下进入这

14、个目录,输入命令 setup.py build。 如果你能编译成功,到你所在目录的 build/lib.win32-2.3下会发现 add.pyd 文件,将文件复制到你所需要的地方 (与 python 同目录下,放在其他目录的话要配置环境变量),启动 python,然后: D:/c;python Python 2.3.3 (#51, Dec 18 2003, 20:22:39) MSC v.1200 32 bit (Intel) on win32 Type “help“, “copyright“, “credits“ or “license“ for more information. ; i

15、mport add ; print dir(add) _doc_, _file_, _name_, add ; add.add(1,2) 3 ;2、C 源码 static PyObject* add(PyObject *self, PyObject *args) int x=0 ; int y=0; int z=0; if (!PyArg_ParseTuple(args, “i|i“, z=x+y; return Py_BuildValue(“i“, z); static PyMethodDef addMethods = “add“, add, METH_VARARGS, “Execute a

16、 shell command,Create by Vince.“, NULL, NULL, 0, NULL PyMODINIT_FUNC initvince() Py_InitModule(“vince“, addMethods); 3、 setup.py #! /usr/bin/python from distutils.core import setup, Extension module1 = Extension(vince, sources = Test.c) setup (name = PackageName, version = 1.0, description = This is a demo package, ext_modules = module1)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报