将Python文件发布成DLL并调用

您所在的位置:网站首页 c调用python编译后的代码 将Python文件发布成DLL并调用

将Python文件发布成DLL并调用

2023-07-19 04:43| 来源: 网络整理| 查看: 265

如何将Python文件发布成DLL供C/C++调用,试过两种思路:

一种是用Cython将Python文件转为.c文件,但是简简单单4行代码,由于调用了NumPy,生成.c文件有5000+行,而且完全找不到原python函数的入口,无奈放弃;

另一种思路是用CPython API给原Python函数写一个C/C++接口调用原函数,再打包成DLL,也是这篇文章的主要内容。

先讲一下我使用的环境:

Python Interpreter: Anaconda3 Python 3.8.5

Python Library: Numpy,目前只试了这一个库,其他应该差不多

IDE: 宇宙最强VS2019 on Windows10

1. 如何生成调用Python函数的DLL

用一个简单的Python函数作为例子,放在test_numpy.py中

import numpy as np def func(my_list1, my_list2): list_np1 = np.array(my_list1) list_np2 = np.array(my_list2) return list(list_np1 + list_np2) # if __name__ == "__main__": # print(func([1, 2, 3], [4, 5, 6])) # 输出:>> 5 7 9

打开VS2019,新建DLL项目,VS会自己生成几个.h和.cpp文件,只需要用到pch.h和pch.cpp两个文件,其他的不用管

首先将本地调试器换成Release x64模式,使用Debug模式需要python38_d.lib文件,有需要可以自行搜索

配置项目属性:给项目添加Python.h的包含目录和库目录,需要将路径换成自己的Python安装路径,在链接器中添加python38.lib,这个取决于你的Python解释的版本,可以在PythonPath\libs里面找到这个文件

配置好环境以后编写函数,主要是用CPython API将C的数组转换成Python的list对象,然后调用原Python函数,得到结果后转换成C的数组,CPython API里面函数很多

附个参考手册Python/C API 参考手册 — Python 3.8.12 文档

pch.h

// pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 #ifndef PCH_H #define PCH_H // 添加要在此处预编译的标头 #include "framework.h" extern "C" _declspec(dllexport) long* listAdd(int a[], int b[], int n); // 将两个数组相加,并返回新数组 #endif //PCH_H

pch.cpp

// pch.cpp: 与预编译标头对应的源文件 #include "pch.h" #include #include using namespace std; // 当使用预编译的头时,需要使用此源文件,编译才能成功。 long* listAdd(int a[], int b[], int n) { Py_SetPythonHome(L"C:\\Users\\10262\\miniconda3\\"); //这里地址一定要写对啊! // 这句语句是在添加python.exe所在路径,不添加虽然编译没有问题,但是会在运行时出现 // Fatal Python error: initfsencoding: unable to load the file system codec // ModuleNotFoundError: No module named 'encodings' // 这种很无厘头的错误 //***python调用***// //初始化python模块 Py_Initialize(); // 检查初始化是否成功 if (!Py_IsInitialized()) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3