python 调用C语言DLL的方法

生成DLL文件

这里使用的开发工具是Dev C++,详细方法可以查看下面这篇文章:
Dev c++工具将C代码生成dll文件以及如何调用dll文件
需要注意的一点是,64位python解释器只能调用64位的dll文件,因此需要安装64位编译器来编译C代码。

新建DLL项目

点击文件->新建->项目,选择DLL,语言选择C项目,然后选择名称和保存位置。
在这里插入图片描述

编写函数代码

新项目会默认生成dllmain.cdll.h两个文件,dll.h中声明了一个函数名,dllmain.c则包含了函数的具体内容,修改函数只需要修改这两个文件中的函数名和函数内容即可,不需要更改其他内容。
修改后,代码中包含了一个名为HelloWorld的函数,功能就是向命令行输出一串文字。
在这里插入图片描述
在这里插入图片描述

编译导出

在工具栏选择编译器为64位,如果没有则需要自行安装。
在这里插入图片描述
点击运行->编译,或者工具栏上的编译按钮,即可生成dll文件。

在这里插入图片描述
打开工程所在的文件夹,会发现有一个dll结尾的文件,只需要将这个dll文件复制到需要调用的位置即可。
在这里插入图片描述

python调用

使用python自带的ctypes即可调用,调用步骤是

  1. 加载DLL模块
  2. 定义函数参数类型
  3. 定义函数返回值类型
  4. 调用函数
import ctypes
libc= ctypes.cdll.LoadLibrary('sample.dll')#这里的参数是文件路径
#libc.HelloWorld.argtypes =[ctypes.c_char_p,ctypes.c_char_p]#指定参数类型,此函数没有参数,仅作示例
#libc.HelloWorld.restype=ctypes.c_double #指定函数的返回值类型,此函数没有返回值,仅作示例
libc.HelloWorld() #调用dll内的函数

输出

Hello world from dll!

调用成功。

测试

为了测试效率首先编写一个即简单又耗时的函数,比如求圆周率:
这个方法借鉴了蒙特卡洛方法,不足之处不必深究,仅仅为了测试效率而已。

def getPi()->float:
    length=10000 #圆半径长
    circle:int=0 #圆形内的点的数量 
    retangle=length*length#方形区域面积

    for x in range(length):
        for y in range(x):
            if x*x+y*y<retangle:
                circle+=1
    
    return circle/retangle*8

然后需要在Dev C++中建立DLL项目,在dll.h文件中将DLLIMPORT void HelloWorld();替换为DLLIMPORT double getPi();然后修改dllmain.c文件,更改函数如下:

DLLIMPORT double getPi() {
	long  length = 10000;
	long  circle = 0;
	long  retangle;
	double   pi;

	retangle = length * length;

	for (int x = 0; x < length; x++) {
		for (int y = 0; y < x; y++) {
			if (x * x + y * y < retangle) {
				circle++;
			}
		}
	}

	pi = (double)circle / retangle * 8.0;
	//printf_s("Value = %f\n", pi);
	return pi;
}

编译成dll文件,然后手动复制到python程序所在的目录。

python主程序:

import time

def getPi()->float:
    length=10000
    circle:int=0 #圆形内的点的数量 
    retangle=length*length#方形区域面积
    for x in range(length):
        for y in range(x):
            if x*x+y*y<retangle:
                circle+=1
   
    return circle/retangle*8

def getPiC()->float:
    import ctypes
    libc= ctypes.cdll.LoadLibrary('pi2.dll')
    #libc.getPi.argtypes =[ctypes.c_char_p,ctypes.c_char_p]#指定参数类型,此函数没有参数,仅作示例
    libc.getPi.restype=ctypes.c_double #指定函数的返回值类型
    pi2=libc.getPi()
    return pi2


print("Python函数运算:")
start=time.time()
pi1=getPi()
end=time.time()
print(f'运算用时:{end-start}')
print(f'运算结果:{pi1}')

print("C语言函数运算:")
start=time.time()
pi2=getPiC()
end=time.time()
print(f'运算用时:{end-start}')
print(f'运算结果:{pi2}')

运算结果:

Python函数运算:
运算用时:7.608693599700928
运算结果:3.14170728
C语言函数运算:     
运算用时:0.08440113067626953
运算结果:3.14170728

python函数和c函数用时差距明显,python用时7.60秒,而C函数仅用时0.08秒。

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高堂明镜悲白发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值