㈠ python 怎么封装有枚举类型的c语言编写的接口
枚举就用几个整数表示就可以了
㈡ 在python中如何调用PCSC中的接口
你找个工具将这个接口API,自动转换成python版本的就可以了。好象是SWIG和Boost。 这两个以前看过,偶尔还试过几次。之所以建议你用自动工具,就是因为python对于C++扩展麻烦些,对于C语言接口可以使用ctypes和cython简单解决。不过C++如果用这些方法有时候被很麻烦。
boost在linux里会经常用到,在windows下也可以使用。SWIG在一般的教程里都会提及到。SIP也是最近出名的。
下面是一些参考资料,搜索来的。
=== 使用工具进行扩展 ===
虽然扩展过程并不复杂,但也可以使用许多已知的工具简化扩展过程。
(1) SWIG
由David Beazley创建,是一个自动的扩展构造工具。它读入注释的C/C++头文件,为python、tcl、perl等多种脚本语言产生wrap代码。SWIG可以包装大量C++特性到Python的扩展模块中。
评价:swig简单,可以支持多种脚本文件,但支持的c++特性不完备。
(2) SIP
由Phil Thompson创建,是一个C++模块构造器,专门为C++的类创造wrapper。它曾经被用于创建PyQt和PyKDE扩展模块,因此比较出名。
评价:支持C++特征很齐全,但比较复杂。
(3) bgen
该工具被包含在标准Python发布包中的模块构建工具集里,由Jack Jansen维护。它用于产生在Macintosh版本可用的Python扩展模块。
(4) pyfort
由Paul bois创建,用来产生Fortran语言生成的扩展模块。
(5) cxx
也由Paul Dubois创建,是一个库,为Python的C++扩展提供了友好的API。Cxx允许将许多python对象(如list和tuple)使用到STL的运算中。库也提供了C++异常处理到python异常处理的转化。
(6) WrapPy
由Greg Couch创建,通过读入C++头文件来产生扩展模块。
(7) Boost Python Library
由David Abrahams创建。该库提供了更多与众不同的C++ wrap到python扩展中,而只需要对要扩展的C++类写很少的附加信息。
评价:Boost为C++提供了许多实用的库,如Regex(正则表达式库)、Graph(图组件和算法)、concept check(检查泛型编程中的concept)、Thread(可移植的C++多线程库)、Python(把C++类和函数映射到Python之中)、Pool(内存池管理)等等。
Boost总体来说是实用价值很高,质量很高的库。并且强调对跨平台的支持。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。
boost.python支持的c++特性较多,但是比较复杂。
㈢ python和c语言交互指针数据没有发生变化
python是当下十分火爆的编程语言,尤其在人工智能应用方面。如果有心从事编程方向的工作,最好到专业机构深入学习、多实践,更贴近市场,这样更有利于将来的发展。
㈣ c语言和python哪个好入门
从开始看Python到现在也有半个多月了,前后看了Python核心编程和Dive into
Python两本书。话说半个月看两本,是个人都知道有多囫囵吞枣,这也是因为我暂时没有需求拿这个做大型开发,主要是平时的小程序test用一用。所以
我的策略是,整体浏览,用到时候现查。话说这核心编程第一版太古老了,老在讲2.2之前的东西,我看的翻译电子版,翻译得也不好,很晦涩。看完这个后还有
点云里雾里,看网上人家说DIP好,啄木鸟还有免费电子文档,就找来看这个。怎么说呢,讲的比核心编程好,但不适合第一次看的初学者。我之所以觉得讲得
好,是因为看核心编程,有些概念还有些模糊,看了这本书就明白不少了。要是初学者上来就看这本,保证不好理解。
下面就是在学习的过程中,在翻阅资料的过程中,总结的一些C和python比较明显的不同之处,有大方向的,也有细节的。肯定没有总结完,比如动态
函数,lambda这些,我都懒得往上写了。实际上,作为两种完全不同的语言,下面这些差异只是冰山一角而已。权当抛砖引玉吧,至少应该对和我有相同研究
兴趣,正在考虑是否学习另一门语言的朋友有点帮助。此文也算是DIP的学习笔记吧。顺带说一句,要是有朋友了解,可以帮忙推荐一下实战性强的Python
教材,语言这东西,不多练手,光比划,是不可能学好的。
学习目的
我的以后的研究方向是嵌入式,显然,C语言是我的主要语言。我不是一个语言爱好者,我以前觉得,对于做研究而不是应用的人来说,了解多门语言,不如
精通一门语言。之所以去看python,主要还是因为python更有利于快速开发一些程序,也是因为现在认识到,研究和应用是不能分离的。个人以为,要
想在计算机工程的竞争中立足,必须懂C语言。因为真正要做高性能编程,
不可能将机器的体系架构抛到脑后让Python虚拟机(或Java虚拟机等)帮你搞定所有底层。越来越多的CPU
core,越来越恐怖的内存性能瓶颈,对于上层开发人员来说,无所谓,但是对高性能程序开发人员来说,这些是无法透明的。很多应用,还是自己掌控比较有
效。这些场合中,汇编和C还是不可替代的。但是,光知道C是不够的,掌握一门面向对象语言,相对更高层的语言,不仅对以后的个人发展有利,也会对自己的技
术认识产生帮助。
如果要问对我来说谁更重要,我觉得还是C更重要。C的学习曲线更陡,貌似简单,实际上到处都是陷阱,看上去比较简单低效的程序,也不是学1,2个月
就能搞定的。谈到优化的深层次和难度嘛,需要的功底是按年算的。但是一旦你C语言的基础打好了,对计算机的理解,对其他语言的理解都是大有裨益的。比如,
如果你有C基础,可以说,学过1天python,就能写的出来一些不短的程序。后面的优化也不是什么大不了的算法,都是非常基本的语句换来换去。当然这里
不是说 Python不好,实际上,上层应用,Python比C方便的不是一个层次。
很多人觉得,既然懂C了,那么进一步掌握C++应该是水到渠成,但C++不是C的超集,而我又不喜欢C++的繁琐和巨大,所以才决定看一看Python。我很喜欢Python的优雅与快捷。
语言类型
和C不一样,Python是一种动态类型语言,又是强类型语言。这个分类怎么理解呢?大概是可以按照下列说明来分类的:
静态类型语言
一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java和 C 是静态类型语言。
动态类型语言
一种在运行期间才去确定数据类型的语言,与静态类型相反。Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。
强类型语言
一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。
弱类型语言
一种类型可以被忽略的语言,与强类型相反。VBScript 是弱类型的。在 VBScript 中,您可以将字符串 ‘12′ 和整数 3 进行连接得到字符串’123′,然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。
对象机制
具体怎么来理解这个“动态确定变量类型”,就要从Python的Object对象机制说起了。Objects(以下称对象)是Python对于数据
的抽象,Python中所有的数据,都是由对象或者对象之间的关系表示的,函数是对象,字符串是对象,每个东西都是对象的概念。每一个对象都有三种属性:
实体,类型和值。理解实体是理解对象中很重要的一步,实体一旦被创建,那么就一直不会改变,也不会被显式摧毁,同时通常意义来讲,决定对象所支持的操作方
式的类型(type,包括number,string,tuple及其他)也不会改变,改变的只可能是它的值。如果要找一个具体点的说明,实体就相当于对
象在内存中的地址,是本质存在。而类型和值都只是实体的外在呈现。然后Python提供一些接口让使用者和对象交互,比如id()函数用来获得对象实体的
整形表示(实际在这里就是地址),type()函数获取其类型。
这个object机制,就是c所不具备的,主要体现在下面几点:
1 刚才说了,c是一个静态类型语言,我们可以定义int a, char
b等等,但必须是在源代码里面事先规定。比如我们可以在Python里面任意一处直接规定a =
“lk”,这样,a的类型就是string,这是在其赋值的时候才决定的,我们无须在代码中明确写出。而在C里面,我们必须显式规定char *a =
“lk”,也就是人工事先规定好a的类型
2 由于在C中,没有对象这个概念,只有“数据的表示”,比如说,如果有两个int变量a和b,我们想比较大小,可以用a ==
b来判断,但是如果是两个字符串变量a和b,我们就不得不用strcmp来比较了,因为此时,a和b本质上是指向字符串的指针,如果直接还是用==比较,
那比较的实际是指针中存储的值——地址。
在Java中呢,我们通过使用 str1 == str2 可以确定两个字符串变量是否指向同一块物理内存位置,这叫做“对象同一性”。在 Java 中要比较两个字符串值,你要使用 str1.equals(str2)。
然后在Python中,和前两者都不一样,由于对象的引入,我们可以用“is”这个运算符来比较两个对象的实体,和具体对象的type就没有关系
了,比如你的对象是tuple也好,string也好,甚至class也好,都可以用”is”来比较,本质上就是“对象同一性”的比较,和Java中
的==类似,和 C中的pointer比较类似。Python中也有==比较,这个就是值比较了。
3
由于对象机制的引入,让Python的使用非常灵活,比如我们可以用自省方法来查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行
操作。用这种方法,你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。 这些操作在C中都是不可想象的。
4 还有一个很有意思的细节,就是类型对对象行为的影响是各方面的,比如说,a = 1; b =
1这个语句中,在Python里面引发的,可能是a,b同时指向一个值为1的对象,也可能是分别指向两个值为1的对象。而例如这个语句,c = []; d
= [],那么c和d是肯定指向不同的,新创建的空list的。没完,如果是”c = d =
[]“这个语句呢?此时,c和d又指向了相同的list对象了。这些区别,都是在c中没有的。
最后,我们来说说为什么python慢。主要原因就是function call
overhead比较大。因为所有东西现在都是对象了,contruct 和destroy 花费也大。连1 + 1 都是 function
call,像’12′+’45′ 这样的要 create a third string object, then calls the string
obj’s __add。可想而知,速度如何能快起来?
列表和数组
分析Python中的list和C中的数组总是很有趣的。相信可能一些朋友和一样,初学列表的时候,都是把它当作是数组来学的。最初对于list和数组区别的定性,主要是集中在两点。首先,list可以包含很多不同的数据类型,比如
["this", 1, "is", "an", "array"]
这个List,如果放在C中,其实是一个字符串数组,相当于二维的了。
其次呢,list有很多方法,其本身就是一个对象,这个和C的单纯数组是不同的。对于List的操作很多样,因为有方法也有重载的运算符。也带来一些问题,比如下面这个例子:
加入我们要产生一个多维列表,用下面这个语句
A = [[None] * 2] * 3
结果,A的值会是
[[None, None], [None, None], [None, None]]
初一看没问题,典型的二维数组形式的列表。好,现在我们想修改第一个None的值,用语句
A[0][0] = 5
现在我们再来看看A的值:
[[5, None], [5, None], [5, None]]
发现问题没有?这是因为用 * 来复制时,只是创建了对这个对象的引用,而不是真正的创建了它。 *3 创建了一个包含三个引用的列表,这三个引用都指向同一个长度为2的列表。其中一个行的改变会显示在所有行中,这当然不是你想要的。解决方法当然有,我们这样来创建
A = [None]*3
for i in range(3):
A[i] = [None] * 2
这样创建了一个包含三个不同的长度为2的列表。
所以,还是一直强调的,越复杂的东西,越灵活,也越容易出错。
代码优化
C是一个很简单的语言,当我们考虑优化的时候,通常想得也很简单,比如系统级调用越少越好(缓冲区机制),消除循环的低效率和不必要的系统引用,等
等,其实主要都是基于系统和硬件细节考虑的。而Python就完全不一样了,当然上面说的这些优化形式,对于Python仍然是实用的,但由于
Python的语法形式千差万别,库和模块多种多样,所以对于语言本身而言,就有很多值得注意的优化要点,举几个例子吧。
比如我们有一个list L1,想要构建一个新的list L2,L2包括L1的头4个元素。按照最直接的想法,代码应该是
L2 = []
for i in range[3]:
L2.append(L1[i])
而更加优化和优美的版本是
L2 = L1[:3]
再比如,如果s1..s7是大字符串(10K+),那么join([s1,s2,s3,s4,s5,s6,s7])就会比
s1+s2+s3+s4+s5+s6+s7快得多,因为后者会计算很多次子表达式,而join()则在一次过程中完成所有的复制。还有,对于字符串操作,
对字符串对象使用replace()方法。仅当在没有固定字符串模式时才使用正则表达式。
所以说,以优化为评判标准,如果说C是短小精悍,Python就是博大精深。
include和import
在C语言中的include非常简单,因为形式单一,意义明确,当你需要用到外部函数等资源时,就用include。而Python中有一个相似的
机制,就是import。乍一看,这两个家伙挺像的,不都是我们要用外部资源(最常见的就是函数或者模块(Python))时就用这个来指明么?其实不
然,两者的处理机制本质区别在于,C中的include是用于告诉预处理器,这个include指定的文件的内容,你都给我当作在本地源文件中出现过。而
import呢,不是简单的将后面的内容*直接*插入到本地里面去,这玩意更加灵活。事实上,几乎所有类似的机制,Python都比C灵活。这里不是说C
不好,C很简练,我其实更喜欢C。
简单说说这个灵活性。import在python中有三种形式,import X, from X import *( or a,b,c……),
X = __import__(’x')。最常用的是第二种,因为比较方便,不像第一种那样老是用X.mole来调用模块。from X
import *只是import那些public的mole(一般都是不以__命名的模块),也可以指定a,b,c来import。
什么时候用哪一种形式呢?应该说,在大多数的模块文档里,都会明确告诉你应该用哪种形式。如果需要用到很多对象,那么from X import
*可能更合适一些,但是,就目前来看,大多数第三方Python库都不推荐使用from molename import *
这种格式。这样做会使引入者的namespace混乱。很多人甚至对于那些专门设计用于这种模式的模块(包括Tkinter,
threading和matplot)都不采用这种方式。而如果你仅仅需要某个对象类a,那么用from X import a比用import
X.a更好,因为以后你调用a的函数直接用a.function()既可以了,不用加X。
如果你连自己希望import的模块都不知道怎么办?请注意,此时Python的优势就体现出来了,我们可以用
__import__(mole)来调用mole,其中这个mole是字符串,这样,可以在运行时再决定,你到底要调用什么mole。举
个例子:
def classFromMole (mole, Name):
mod = __import__ (mole)
return getattr (mod, Name)
这里,定义了一个函数classFromMole,你可以在代码的任何时候调用它,
o = classFromMole (MoleOfTheClass, NameOfTheAttribute)()
只需要传入字符串形式的你希望import的模块MoleOfTheClass和其中属性的名字NameOfTheAttribute(当然可以是数据也可以是方法),就能调用了,这个名字字符串不用事先指定,而是根据当时运行的情况来判断。
顺带说一句,Python中import的顺序也有默认规定,这个和C中的include有点类似,因为我们一般都是先include系统文件,再
include自己的头文件(而且还有<>和“”的区别)。Python中呢,一般应该按照以下顺序import模块:
1. 标准库模块 — 如 sys, os, getopt 等
2. 第三方模块
3. 本地实现的模块。
全局变量
这里谈全局变量呢,倒不是说Python和c的全局变量概念不同,他们的概念是相同的。只是在使用机制上,是有一些差异的。举个例子:
– mole.py –
globalvar = 1
def func():
print globalvar
# This makes someglobal readonly,
# any attempt to write to someglobal
# would create a new local variable.
def func2():
global globalvar
globalvar = 2
# this allows you to manipulate the global
# variable
在 func这个函数中,globalvar是只读的。如果你使用了globalvar =
xxx这种赋值语句,Python会重新创造一个新的本地对象并将新值赋给它,原来的对象值不变。而在func2函数中,由于我们事先申明了
globalvar是global的,那么此时的更改就直接在全局变量上生效。
㈤ python能做的事情用C语言都能做到,那么C语言能完成的事情用python是否也都能完成
C语言完成的很多事情python是做不到的。
越万能的语言一般越低级,因此使用越麻烦,越高级的语言越与应用靠近,但是通用性越差。
你说的那个万能语言就是汇编语言,可以解决任何问题。
㈥ Python C API使用时需要注意什么
一:用C API为Python写C语言函数,以方便Python中调用
1. 首先实现一个特定原型的函数,用Python C API来实现的话,所有函数必须是这种原型。必须是类似这样的
PyObject *Fun(PyObject *self, PyObject *args)
self应该是在用类的时候才会用到(我没有用到),args就是函数的参数。因为args是一个PyObject*类型(可以代表Python语言中的任何类型)
2. 将参数转换成C 语言表示的内容,用PyArg_ParseTuple函数。
3. 执行完需要的操作后,也必须返回一个PyObject*类型的值。通过Py_BuildValue函数来构建。
这里要说的是,假如希望返回一个Tuple类型的值,可以先用
PyObject *tuple = Py_BuildValue("(iis)", 1, 2, "three");
形式来构建,假如很多的话,可以用下面的方式来构建
PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyLong_FromLong(1L));
PyTuple_SetItem(t, 1, PyLong_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));
这一点在刚开始开工的时候迷惑了很久。
4. 将要输出的所有函数放入一个数组中,数组的结构是:
struct PyMethodDef {
const char *ml_name; /* The name of the built-in function/method */
PyCFunction ml_meth; /* The C function that implements it */
int ml_flags; /* Combination of METH_xxx flags, which mostly
describe the args expected by the C func */
const char *ml_doc; /* The __doc__ attribute, or NULL */
};
数组以{NULL, NULL}结束
5. 构造一个Python import时初始化的函数
类似
PyMODINIT_FUNC
initexample(void)
{
Py_InitMole("example", example_methods);
}
这里有个特别需要注意的是,初始化函数名字有严格要求,init后面必须跟模块名,否则Python找不到确定的函数会报没有初始化函数的错误
扩展模块写完后,编译成动态库(Python要求此动态库名字为pyd,实际就是改个后缀而已)。就可以直接在Python脚本中用import的方式加载了,对于使用来说,根本不需要知道此库是用C API扩展写的还是直接用Python语句写的(这点Lua做的也是一样好)
最后,python的源代码中附带了一个叫做example_nt的例子,可以参考一样,完整的扩展代码如下:
#include "Python.h"
static PyObject *
ex_foo(PyObject *self, PyObject *args)
{
printf("Hello, world/n");
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef example_methods[] = {
{"foo", ex_foo, METH_VARARGS, "foo() doc string"},
{NULL, NULL}
};
PyMODINIT_FUNC
initexample(void)
{
Py_InitMole("example", example_methods);
}
二.C语言中调用Python语句
首先,void Py_Initialize()用来初始化,void Py_Finalize()用来结束Python的调用,这是必须要的。
燃火分两种情况,假如仅仅是几条语句的话,那么以PyRun_为前缀的一些函数都很好用,比如
int PyRun_SimpleString(const char *command)
函数就可以直接执行一条char*的Python语句。
需要获得返回值得话
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
也很好用,以上两个函数用来处理Python源代码已经读入内存的情况,在文件中的时候
int PyRun_SimpleFile(FILE *fp, const char *filename)
PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
使用类似。不多讲了。
假如是个模块的话(比如一个函数),希望在C语言中调用的话那么使用起来就稍微复杂了一点。这种情况的需要在于你可以从C语言中向Python函数中传入参数并且执行,然后获取结果。
此处又分为几种情况:
在文件中,在内存中,编译过的,源代码。
在文件中都很好解决,和上面一样。这里主要讲在内存中的情况。(事实上我工作中需要并且耗费了很长时间才找到解决方法的就是这种情况)
未编译时:(也就是源代码)
1.通过
PyObject* Py_CompileString(const char *str, const char *filename, int start)
API首先编译一次。此API的参数我说明一下,str就是内存中的源代码,filename主要是出错时报错误用的,事实测试证明,你随意给个字符串也没有关系,但给NULL参数在运行时必然报错。start我一般用的是Py_file_input,因为的确是从文件中读取过来的,相对的还有Py_single_input用来表示一条语句,Py_eval_input的用法我也不是太清楚。
源代码通过此函数调用后,获得编译后的PyObject*,(其实假如跟进源代码中去看,是一个PyCodeObject结构)假设命名为lpCode。
2.此时再调用API
PyObject* PyImport_ExecCodeMole(char *name, PyObject *co)
导入模块。参数也说明一下,name为导入的模块名,co就是前面编译过的代码对象(lpCode)。返回的就是模块对象了,假设命名为lpMod。
3.再调用API
PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)
获得函数对象。o就是模块对象(lpMod),attr_name就是你想要调用的函数名了,假设叫main的函数,就是”main”,然后返回的就是函数对象,假设命名为lpFun。
4.此时可以用API
int PyCallable_Check(PyObject *o)
去检查一下是不是获得了一个函数。假如确定的话,就可以直接用
PyObject_Call开头的一族函数调用lpFun了。这些函数包括很多,一般就是输入参数的不同,但是效果都是一样的,就是调用函数而已。参数一般可以通过前面说过的build函数来获得,返回值也是获得一个PyObject*,可以通过PyArg_那个函数来获取,但是好像不太好,那是分析参数用的。推荐用确定类型(假设为type)的类似Py[type]_As的函数来获取。
比如:
long PyLong_AsLong(PyObject *pylong)获取long
double PyLong_AsDouble(PyObject *pylong)获取double
这里想说的是,应该有直接从源代码中获取函数调用对象的方式,但是我本人没有试出来,有人知道请一定赐教!
编译过的代码:
对于编译过的代码和上面就是获得编译后的PyCodeObject对象,当然在源代码中表示还是PyObject*的方法不同(上例中的lpCode)。
当然要想以后获得一个编译后的lpCode,自然要先编译一下啦。但是纯粹编译成pyc结尾的文件后,直接读入内存,我没有找到将其转化为PyCodeObject对象的方法(也希望有人知道能告诉我!)
我找到的方法是先用
PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version)
void PyMarshal_WriteLongToFile(long value, FILE *file, int version)
两个函数先把PyCodeObject对象(lpCode)序列化到文件或者内存中。
再在需要的时候用函数
PyObject* PyMarshal_ReadObjectFromFile(FILE *file)
PyObject* PyMarshal_ReadObjectFromString(char *string, Py_ssize_t len)
读出来,读出来的PyObject*其实就是想要的PyCodeObject对象了(lpCode)。接下来的步骤与未编译时的步骤一样。
光是这个扭曲的方法我还是参考老总给的半边资料反复研究出来的。而真正直接有效的方法我还是没有找到。
㈦ python 怎么调用c语言接口
ctypes: 可直接调用c语言动态链接库。
使用步骤:
1> 编译好自己的动态连接库
2> 利用ctypes载入动态连接库
3> 用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:
#Step1:test.c#include<stdio.h>
intadd(inta,intb)
{
returna+b;
}#Step2:编译动态链接库(如何编译动态链接库在本文不详解,网上资料一大堆。)gcc-fPIC-sharedtest.c-olibtest.so
#Step3:test.py
fromctypesimport*mylib=CDLL("libtest.so")或者cdll.LoadLibrary("libtest.so")add=mylib.add
add.argtypes=[c_int,c_int]#参数类型,两个int(c_int是ctypes类型,见上表)
add.restype=c_int#返回值类型,int(c_int是ctypes类型,见上表)
sum=add(3,6)
㈧ python Ctypes 重写C接口的问题
>>>fromctypesimport*
>>>ppvoid=POINTER(c_void_p)
>>>ppvoid
<class'__main__.LP_c_void_p'>
㈨ 为什么python可以调用C或者C++写的模块
Python的API(应用程序编程接口)定义了一系列的函数、宏指令和变量 来与Python的运行系统的大部分方面进行连接通信,而通常来说,用C语言编写的Python API 会在程序文档里添加“python.h”作为头文件。
按我的理解来说就像Python把一个值交给运行系统,然后运行系统把这个值转化成C语言能够识别的值,然后交到C语言模块去做运算,运算好了把结果值交给Python的运行系统,处理成Python能够识别的值。
你不妨看看这几个网页:
http://hi..com/softguarder/blog/item/c3dc8b02b44cec80d43f7c57.html
http://docs.python.org/extending/extending.html#a-simple-example
http://hi..com/softguarder/blog/item/c3dc8b02b44cec80d43f7c57.html