2020-11-04

window 和 linux 系统调用 c++函数生成的可执行文件。

由于网络学习的python代码中某一步骤处理速度太慢,所以用可执行文件代替,加快训练运行速度,记录如下:

#######################################################################################################################################################################################

window系统上使用VS编译c++函数,生成python可执行文件,并调用。

使用vs建立c++工程,配置,编写函数规范

参考网站: 

https://blog.csdn.net/qq_29176963/article/details/103899333

https://blog.csdn.net/maosijunzi/article/details/79354806

https://blog.csdn.net/GitChat/article/details/78537098?utm_medium=distribute.pc_feed_404.none-task-blog-BlogCommendFromBaidu-5.nonecase&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-BlogCommendFromBaidu-5.nonecas

建立c++空项目,配置如下。

注意点一:c++代码中有#include <Python.h>  ,此  python包含目录和库目录及依赖项需要是最终要运行的python代码中的python环境库。我的python项目是Anaconda中的安装的python库,所以有下面的相关配置。

 

 

 

 

 

 

注意点二: python代码中传入的参数是list类型,需要转换为c++函数中需要的类型;同样c++函数运行后输出也要转换为list类型传回给python代码环境。因此需要在c++代码中写转换函数以进行转换。

c++函数主要几个部分包括:

(1)初始化函数,此部分是python调用执行的开始。

注意project_name就是你的项目名称,注意修改。PCmodule是下面的定义的模块。

(2)模块定义部分

“fs”名字可以随意,test_methods是这各模块中的方法列表名称,可以包含多个方法,见下面。

(3): 方法定义:

这里方法里面只有一个方法模块,可以定义多个方法模块。如下面定义了两个方法GGgroup,GGgroup1:

(4),方法实现函数:ffFs方法

方法实现函数里面主要有下面几个部分:

(a),接收调用传入的参数:整数等常见类型直接可以接收,其他的类型则要通过Pyobject定义类型接收。顺序按照传入参数的顺序,"oi"分别指类型对象和整数。

 

(b), python传入参数类型转换为c++函数可辨识类型。这里以下面的函数为例:

在上面方法实现函数中对其进行调用:

 

(c), c++功能函数部分: 即你要用c++代码实现的功能,因为现在输入的参数已经知道且转换完毕了。

 

将其在方法实现函数中调用。

 

(d), 将c++功能函数返回值转换为python类型并返回,以下函数为例。

 

在方法实现函数中的调用:

 

如果方法列表中包含多个方法,则需要定义多个方法函数。

 

注意点三:内存泄漏问题。c++代码要保证不存在内存泄漏问题,如果每次调用这个执行函数文件,都存在内存的泄露,内存会不断增加消耗。

如下图中的注意一步,必须要释放新建的PyList_New, 若是返回值就不需要释放。:

参考网站:

https://blog.csdn.net/daineng/article/details/3786581?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

https://www.cnblogs.com/OCaml/archive/2012/06/29/2568920.html

https://ask.csdn.net/questions/362191

主要注意代码中是否有需要释放的变量。

编译生成工程,生成DLL文件,修改为.pyd文件,将其放入对应python环境中Lib\site-packages文件夹下,然后就可以在python代码中import使用了。

######################################################################################################################################################################################################################################

linux系统上使用g++编译c++函数,生成python可执行文件并调用

参考网站:

https://blog.csdn.net/sinat_37532065/article/details/86537247

 

linux系统上调用的是.so文件,因此需要使用g++将.cpp文件编译成.so文件,然后放入对应python环境中lib/python3.7/文件夹中,在python代码import调用。

注意点:编译命令需要带有优化参数,否则代码运行非常慢。上面的vs编译中有优化参数。

 

注意点1: 代码修改

在上述代码的基础上,加上模块初始化函数声明和主函数调用部分。

 

 

注意点2,代码编译优化选项和参数路径

到cpp文件所在文件夹执行编译命令。

代码如下:这里要选择正确的python路径,参照上面python路径,linux和windows上的包含路径有所不同。即包含Python.h文件的路径。

可以在文件中设置,也可以直接在命令行内指定,包含路径设置,库路径设置等参考网站:

https://blog.csdn.net/arackethis/article/details/43342655

优化参数设置:

这里在命令中加入 -O2选项即可。参考网站:

https://blog.csdn.net/hit_090420216/article/details/44900215

https://blog.csdn.net/weixin_38145317/article/details/105241512

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值