python与c 交互原理_PYTHON 与C相互交互调用实例解析 | 学步园

PYTHON 与C相互交互调用实例解析

使用前工具:

Vc++编译器

Python 解释器

1  C文件中调用PYTHON解释器提供的调用API接口来执行python语句

#includeintmain(intargc,char*argv[])

{

Py_Initialize();

PyRun_SimpleString("from time import time,ctime");

PyRun_SimpleString("print 'Today is',ctime(time())");

Py_Finalize();return0;

}

直接用VC编译上面的文件就是可以

2  用C生成DLL, 用PYTHON调用

C代码:foo.c

#includestaticPyObject*foo_bar(PyObject*self, PyObject*args);staticPyMethodDef FooMethods[]={

{"bar", foo_bar, METH_VARARGS},

{NULL, NULL}

};/*模块初始化函数*/voidinitfoo()

{

(void) Py_InitModule("foo", FooMethods);

}/*导出函数*/staticPyObject*foo_bar(PyObject*self, PyObject*args)

{char*string;intlen;if(!PyArg_ParseTuple(args,"s",&string))returnNULL;

len=strlen(string);returnPy_BuildValue("i", len);

}

文件:foo.def

EXPORTS

initfoo

编译生成foo.dll

Cl -c foo.c;

link foo.obj /dll /def:foo.def /OUT:foo.dll

在PYTHON中调用:

Import foo

Dir(foo)

即可以看到结果:

>>> import foo

>>> dir(foo)

['__doc__', '__file__', '__name__', 'bar']

>>> ^Z

一个典型的Python扩展模块至少应该包含三个部分:导出函数、方法列表和初始化函数。

2.1 导出函数

要在Python解释器中使用C语言中的某个函数,首先要为其编写相应的导出函数,上述例子中的导出函数为foo_bar。在Python的C语言扩展中,所有的导出函数都具有相同的函数原型:

PyObject* method(PyObject* self, PyObject* args);

方法列表中给出了所有可以被Python解释器使用的方法,上述例子对应的方法列表为:

staticPyMethodDef FooMethods[]={

{"bar", foo_bar, METH_VARARGS},

{NULL, NULL}

};

方法列表中的每项由四个部分组成:方法名、导出函数、参数传递方式和方法描述。方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了Python向C函数传递参数的具体形式,可选的两种方式是METH_VARARGS和METH_KEYWORDS,其中METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器和C函数之间传递参数,若采用METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递

所有的Python扩展模块都必须要有一个初始化函数,以便Python解释器能够对模块进行正确的初始化。Python解释器规定所有的初始化函数的函数名都必须以init开头,并加上模块的名字。对于模块foo来说,则相应的初始化函数为:

voidinitfoo()

{

(void) Py_InitModule("foo", FooMethods);

}

C定义当Python解释器需要导入该模块时,将根据该模块的名称查找相应的初始化函数,一旦找到则调用该函数进行相应的初始化工作,初始化函数则通过调用Python的C语言扩展接口所提供的函数Py_InitModule(),来向Python解释器注册该模块中所有可以用到的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值