python 编程开发 —— 在 Python 中引入 C/C++动态链接库(DLL)

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

1、环境

Python : V3.8.8 32bit
Visual Studio 2015 Win32 Debug

2、生成 C/C++ 动态链接库(dll)

  C/C++ 动态链接库的生成可以参考《C/C++ 动态链接库(dll)的生成与调用》这篇文章。

//Testdll.h 文件
#pragma once

#include <iostream>
#include <string>
using namespace std;


#ifdef ALIVEN_DLL_EXPORT
#define ALIVEN_DLL_API extern "C" __declspec(dllexport)
#else
#define ALIVEN_DLL_API extern "C" __declspec(dllexport)
#endif

ALIVEN_DLL_API void AlivenPrint1();
ALIVEN_DLL_API void AlivenPrint2(int a, int b);



//Testdll.cpp 文件
# include "Testdll.h"

void AlivenPrint1()
{
    
    
	cout << "@@ C++ Testdll" << endl;
	return;
}

void AlivenPrint2(int a, int b)
{
    
    
	cout << "@@ C++ Testdll " << a << " - " << b << endl;
	return;
}



3、在 python 调用dll

# 先打印下yhon
print("@@ Python file")

# 调用 ctypes 库
from ctypes import *  # * 表示导出所有 dll 导出的库

# 加载 C/C++ dll 库
aliven = CDLL("D:\VS2015\Project\Testdll\Debug\Testdll")

# 调用 C/C++ 库函数
aliven.AlivenPrint1()  # 无参
a = 12
b = 23
aliven.AlivenPrint2(a, b) # 有参

  Python 调用 C/C++ 动态链接库文件时,只需要一个 dll 文件即可(它是直接加载的动态链接库)。
在这里插入图片描述

执行 Python 脚本后的输出:
在这里插入图片描述

4、ctypes 介绍

  模块 ctypes 是 Python 内建的用于调用动态链接库函数的功能模块,一定程度上可以用于 Python 与其他语言的混合编程。由于编写动态链接库,使用 C/C++ 是最常见的方式,故 ctypes 最常用于 Python 与 C/C++ 混合编程之中。

ctypes 的原理以及优缺点

  • ctypes 有以下优点:

1、Python内建,不需要单独安装
2、可以直接调用二进制的动态链接库
3、在Python一侧,不需要了解Python内部的工作方式
4、在C/C++一侧,也不需要了解Python内部的工作方式
5、对基本类型的相互映射有良好的支持

  • ctypes 有以下缺点:

1、平台兼容性差
2、不能够直接调用动态链接库中未经导出的函数或变量
3、对C++的支持差

猜你喜欢

转载自blog.csdn.net/Aliven888/article/details/115435817
今日推荐