苏州做商城网站,做搜狗网站点击赚钱,软件定制开发公司官网,做一网站要什么软件文章内容为原创#xff0c;欢迎转载请注明出处作者#xff1a; EflyPro-晦明禅师1.背景python作为解析语言大规模应用在各个领域#xff0c;c语言作为系统级别的语言广泛应用在基础#xff0c;系统#xff0c;网络等底层服务当中#xff0c;可以说python和c语言之间各…文章内容为原创欢迎转载请注明出处作者 EflyPro-晦明禅师1.背景python作为解析语言大规模应用在各个领域c语言作为系统级别的语言广泛应用在基础系统网络等底层服务当中可以说python和c语言之间各有擅长和不擅长的地方今天文章讨论的是如何使用python开发的程序调用c语言写的库文件使得两种语言得以互补。2.ctypesctypes是python自带的用于跟c语言做对接的库里面提供了针对c语言数据类型除此还提供了加载动态库和调用动态库函数的功能比如在windows下可以加载dll文件并可以调用里面的函数接口在linux下可以加载so文件调用里面的函数接口。3.例子我们使用ctypes库调用c语言经常用到的printf函数作为一个简单的例子下面是具体python代码 import ctypes ctypes.cdll.LoadLibrary(libc.so.6) libc ctypes.CDLL(libc.so.6) libc.printf libc.printf(hello %s\n, world!)hello world!13简单解析一下上面的几行代码我们知道printf函数是c语言基础库放在libc.so文件里面以例子所在Ubuntu 16.04 x64 Server具体路径是 /lib/x86_64-linux-gnu/libc.so.6首先是用ctypes加载对应的so文件因为libc是系统基础库文件所以不用指定绝对路径加载完之后就实例化libc的对象比如程序的libc然后就可以调用libc里面的printf函数了。根据printf的函数原型除了输出字符信息之外还返回输出信息的长度所以我们看到除了输出hello world之外下面返回的14就是字符串的长度。4.实战上面3的例子是调用系统自带的库下面我们自己尝试用c语言编写一个动态库然后使用ctypes调用里面的函数接口。我们先用c语言编写一个最简单的库然后这个库里面只有一个函数接口。foo.h#ifndef foo_h__#define foo_h__extern void foo(void);#endif // foo_h__foo.c#include void foo(void){printf(Hello, Im a shared library);}编译foo so动态库gcc -c -Wall -Werror -fpic foo.cgcc -shared -o libfoo.so foo.o一切顺利的话当前目录下会有一个libfoo.so的动态库文件下面我们写一个main.c的程序测试一下这个libfoo.so库main.c#include #include foo.hint main(void){printf(This is a shared library test...);foo();return 0;}编译main.c文件#这里需要用-L参数告诉gcc我们的so库所在目录要不gcc会找不到我们的库gcc -L/tmp/test -Wall -o test main.c -lfoo一切顺利之后会产生test的执行文件我们执行它不过执行之前我们先要定义一下系统库路径要不执行test的时候系统会提示找不到库文件export LD_LIBRARY_PATH/tmp/test:$LD_LIBRARY_PATH./test顺利输出信息。我们知道我们的libfoo.so是正常可用的那么我们就写一个python程序去调用我们的libfoo里面的foo函数接口。main.py import ctypes ctypes.cdll.LoadLibrary(/tmp/test/libfoo.so) libfoo ctypes.CDLL(libfoo.so) libfoo ctypes.CDLL(/tmp/test/libfoo.so) libfoo libfoo.foo()Hello, Im a shared library27具体代码其实跟3.例子类似只是因为我们的库是非系统的所以要指定绝对路径而已字符串最后的27是输出字符串的长度。由睿江云提供想了解更多请登陆www.eflycloud.com