如何让python调用C和C++代码二、Python调用C/C++1、Python调用C动态链接库Python调用C库比较简单python解析c函数,不经过任何封装打包成sopython解析c函数 , 再使用pythonpython解析c函数的ctypes调用即可 。(1)C语言文件python解析c函数:pycall.c[html]viewplaincopy/***gcc-olibpycall.so-shared-fPICpycall.c*/#include#includeintfoo(inta,intb){printf("youinput%dand%d\n",a,b);returna+b;}(2)gcc编译生成动态库libpycall.so:gcc-olibpycall.so-shared-fPICpycall.c 。使用g++编译生成C动态库的代码中的函数或者方法时python解析c函数,需要使用extern"C"来进行编译 。(3)Python调用动态库的文件:pycall.py[html]viewplaincopyimportctypesll=ctypes.cdll.LoadLibrarylib=ll("./libpycall.so")lib.foo(1,3)print'***finish***'(4)运行结果:2、Python调用C++(类)动态链接库需要extern"C"来辅助 , 也就是说还是只能调用C函数 , 不能直接调用方法,但是能解析C++方法 。不是用extern"C",构建后的动态链接库没有这些函数的符号表 。(1)C++类文件:pycallclass.cpp[html]viewplaincopy#includeusingnamespacestd;classTestLib{public:voiddisplay();voiddisplay(inta);};voidTestLib::display(){cout#include#includeintfac(intn){if(n2)return(1);/*0!==1!==1*/return(n)*fac(n-1);/*n!==n*(n-1)!*/}char*reverse(char*s){registerchart,/*tmp*/*p=s,/*fwd*/*q=(s+(strlen(s)-1));/*bwd*/while(p
解析Python函数变量如何使用刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义 , 这个*和**让人有点费解 。其实只要把函数参数定义搞清楚了,就不难理解了 。
先说说函数定义,我们都知道,下面的代码定义了一个函数funcA
def funcA():
pass
显然,函数funcA没有参数(同时啥也不干:D) 。
下面这个函数funcB就有两个参数了,
def funcB(a, b):
print a
print b
调用的时候,我们需要使用函数名,加上圆括号扩起来的参数列表 , 比如 funcB(100, 99),执行结果是:
100
99
很明显,参数的顺序和个数要和函数定义中一致,如果执行funcB(100),Python会报错的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我们可以在函数定义中使用参数默认值,比如
def funcC(a, b=0):
print a
print b
在函数funcC的定义中 , 参数b有默认值,是一个可选参数,如果我们调用funcC(100),b会自动赋值为0 。
OK,目前为止,我们要定义一个函数的时候 , 必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数) 。一般情况下这是没问题的 , 但是也有在定义函数的时候,不能知道参数个数的情况(想一想C语言里的printf函数) , 在Python里,带*的参数就是用来接受可变数量参数的 。看一个例子
def funcD(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
调用funcD(1, 2, 3, 4, 5, 6)结果是
1
2
length of c is: 4
(3, 4, 5, 6)
我们看到,前面两个参数被a、b接受了,剩下的4个参数,全部被c接受了,c在这里是一个tuple 。我们在调用funcD的时候 , 至少要传递2个参数,2个以上的参数,都放到c里了,如果只有两个参数 , 那么c就是一个empty tuple 。
好了 , 一颗星我们弄清楚了,下面轮到两颗星 。
上面的例子里,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,比如funcB(100, 99)和funcB(99, 100)的执行结果是不一样的 。在Python里,还支持一种用关键字参数(keyword argument)调用函数的办法 , 也就是在调用函数的时候,明确指定参数值付给那个形参 。比如还是上面的funcB(a, b),我们通过这两种方式调用
推荐阅读
- unity速度飞行游戏,unity 速度
- 库房sap,库房sap操作
- 什么是视频直播设备,现场直播设备一般包含哪些设备?这些设备的功能是什么?
- ios射击飞行游戏,ios射击飞行游戏排行榜
- mysql怎么建表的名字 mysql 如何建表
- 怎么样升级小米路由器固件,小米路由器手动升级固件
- java绘图工具代码,java绘图板
- 毕业设计校园网络建设,毕业设计校园网络建设方案
- 阿里云linux命令入门 阿里云盘linux