前言
我们都知道python的跨平台能力强,可以在不同操作系统上使用。它的可扩展性也很强,它可以混合使用C语言和Java。那么今天就来学习一下,python对c语言的扩展使用。
1 为什么要调用C
我们都知道python的第三方库很多,基本c能干的事它都可以干,可是为什么还要调用c呢?
1、因为c在国内的发展很早,目前有很多C已经封装好的功能函数,为了方便起见,我么们就可以直接用python调用它。这样就会省掉很多麻烦。
2、我们再用python写代码时,当然会有很多代码我们不希望被别人看到,这样我们就可以将这段代码用c语言进行编写,然后再python中调用,这样会起到加密效果。
2 配置C编译环境
这个我是早上用的时候发现的,因为我的C编译环境安装到了我的移动固态,所以早上再生成.so文件时半天无法识别所以我就试着插上我的移动固态,结果成功了。所以可能还的需要安装c编译环境。安装mingw-w64编译器,安装挺简单的,百度都有可以自行查找一下,安装完成之后记得配置资源环境。我大概说一下怎么配置,其实配置方法安装mingw-w64编译器的方法里基本都会讲的。
例如我的编译器再这里安装的
3 写一个简单的c函数
例
#include "stdio.h"
char* test()
{
char *a = {"你好"};
return a;
}
然后再终端输入一下代码,记得你的c文件名和下方的代码.so一定要一致。
写完后然后回车执行,执行完后就会生成一个.so文件
gcc -o test.so --share -fPIC test.c
输入命令时注意你的文件名
之后会生成一个.so文件
4 在python中用ctypes模块导入
在这里我写了这么多str相关参数是为了区分如何将c函数的数据正确打印出来。
from ctypes import * # 导入模块
dll = CDLL("./test.so") # c文件和.so文件一定要在当前python工程文件下
str = dll.test()
str1 = string_at(str)
str2 = str1.decode('utf-8')
#方法1:失败
print(type(str))
print(str)
#方法2:失败
print(type(str1))
print(str1)
#方法3:成功
print(type(str2))
print(str2)
我们来看一下执行效果
很显然str2才是我们想要的结果,所以在调用时注意返回的格式
5 开发实战
实战项目功能之一:用c写一个随机生成4位的验证码,并在python中pyqt5的ui界面将验证码显示出来。
首先我们先将随机生成验证码的函数用C语言写出来。
4位验证码随机生成函数
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
char b[4];
char a[63]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//定义一个包含63个字符的字符串
char* code()
{
int i,j;
srand((int)time(0));//初始化随机数发生器
for(i=0;i<4;i++)
{
j= rand()%62;//取得0~61的随机数
b[i]=a[j];
}
return b;
}
然后在终端写 gcc -o code.so --share -fPIC code.c回车执行
然后在主函数中先封装,再调用。
下来看看展示效果
总结
其实这个用c语言写得随机生成验证码的代码不是我写得,而是一个可爱的小仙女帮我写的,我就是为了方便,然后直接在python中调用它去实战开发,顺便也巩固今天的知识点。确实省了不少的力。再次感谢这位可爱的小仙女。
如果悲观可以轻易的被外在的成功打消,我敢断定那不是悲观,而是肤浅的烦恼。