VS2017 C++工程 执行python脚本

我解决了哪怕很小的一个问题,我也想记录下来来见证我的经历。

背景:

一、使用libhuru库生成pdf报告

最近参与一些测试工作,希望测试结束后能够根据测试得到的数据和图像自动生成测试报告,最开始调研到了生成报告的库有libharu和libpdf,libharu是开源库但是很久没有人维护了,libpdf商业使用需要授权,最后选择使用libharu,关于使用libharu库,首先是对应的libhpdf.lib库的编译,需要依赖zlib和libpng两个库,在windows下使用cmake编译的步骤可以参考这篇博客,libharu编译过程,我按照这篇文章编译了64位的libhpdfs.lib,关于基于libharu库,可以解决报告中的表格和图像加载的问题的例程,可以参考这里基于libharu库生成pdf报告的例程。我使用刚才编译的64位的libhpdf.lib来编译这个例程,除了加载png图像失败之外,其他我用到的函数都是正常的。我只能先加载jpg图像,但是图片压缩严重,不够清晰。就无法加载png图像这个问题,我咨询过这个例程的作者,作者也很友好的测试了我的demo,并没有复现我描述的问题,后来我使用了他提供的libhpdf.lib,竟然成功加载了png图像,当然我必须是在x86的模式下,而我的大工程是x64的,所以这个问题很是不好解决,网上也看到很多小伙伴反应使用libhpdf库不能成功加载png图像的问题,问题主要出在下面这个函数,这个函数调用后返回的img为空,所以无法在pdf文件上加载图像。有网友说是分配内存失败,但是我一直也没有找到解决这个问题的有效的方法,只好先放一下。

img = HPDF_LoadPngImageFromFile(pdf, t.path.c_str());

上个月末,跟line manager汇报工作,他对我生成的报告上的图像很是不满意,其实穷自己也不满意,实在是不清晰,但是这个问题一直没能得到解决,我也是很是苦恼,他再次给我建议试一下使用python看能不能有好的解决方法,一想到我需要使用python重新搞一遍,我就有些苦恼,担心工作量会很大,这又到月末,如果做不出效果,要影响我这个月的绩效了。但是没有办法,谁让我自从五一放假回来后,就有些不思进取,玩物丧志呢,我还是 硬着头皮,继续搜索python方法。前几天刚充了会员,现在一搜,搜到了下面这篇文章,使用python生成图文并茂的pdf报告,让我耳目一新,感叹一句,花了钱果然不一样,办事效率高了很多。

二、使用python和reportlab库生成pdf报告

1. windows下安装reportlab

首先要保证你电脑上已经安装了python了哈,我电脑安装的python版本为3.8.7

pip版本为20.3.3

然后

1. win+R 
2. 输入cmd  #打开命令行窗口
3. 在命令行输入:pip install reportlab

如果在安装失败请查看这篇文章,那你退出那个软件(哈哈,你懂得),再重现安装一下。

三、参考现有的例程

我第一次接触reportlab这个库,想在很短的时间内看到让人满意的效果,我不得不依赖于一个县城的模板,于是我找到了这篇文章python之reportlab生成PDF文件。这个例子对于初学者来说是很具有参考价值的,但是唯一不足的地方是,调用函数时的输入没有给出,因为我对python使用不熟,不过经过几次测试,和研究也能够搞清楚,函数的输入时directory和List类型。因为我已经把测试数据保存到本地的csv文件中,所以我读取了csv文件将里面的数据写入到表格中去。

四、在C++工程中执行python脚本

我的工作环境是win10,64位VS2017,我的测试工程是用C++写的,我希望的是在测试程序运行结束后,但是程序退出之前执行python脚本自动生成pdf测试报告,那我面临的一个问题就是如何在C++工程中执行python脚本,那么你就可以直接使用一个简单直接粗暴有效的方法就可以。这几行代码就是去执行你指定的python脚本, 如果你需要将C++中的一些参数传递给python脚本,那么直接在command后面加上所需要参数就可以了。

std::string filename = "./test_report.py";
std::string command = "python ";
command += filename;
system(command.c_str());

五、C++工程中调用python函数或者进行数据交换

1. 首先可以参考这篇文章配置相应的python环境Windows10 C++(VS2017)调用python(python3.8)python配置,

(1)

(2)

(3)

2. 添加环境变量

 

上面的环境配置好了后可以测试一下上面链接中博主给的例子。我测试的结果存在一个问题就是,当执行的是普通的python脚本,也就是该python脚本中没有调用第三方库的时候,可以成功执行,但是当python脚本中有调用第三方的库,如通过import numpy as np调用numpy库时,demo中的pModule = PyImport_ImportModule("helloWorld");就会出错,返回的pModule为空。而如果删掉import numpy as np,又正常调用了,我花了一天的时间一直没有解决这个问题,后来考虑到我只是执行单独的一个脚本,不需要进行数据交换,也不需要在C++工程中调用python中的函数,那就用最简单直接的方法解决问题吧,就是我在上面说到的方法。

std::string filename = "./test_report.py";
std::string command = "python ";
command += filename;
system(command.c_str());

如果有效伙伴也遇到了上面的问题,并且最终解决了,请指教,哈哈。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标准正弦波变频电源调制方式的实现

目前变频电源正不断向规模化、专业化、智能化、精细化方向发展。变频电源的技术随着工业电器电子制造的兴起而不断得到重视和发展。其中,中港扬以正弦脉SPWM为核心变频电源系统电路便是一个很好的代表。纯硬件电路在焊接电路上比较复杂,但是调节出来的SPWM波形比较完…

Jmeter教程索引贴

Jmeter教程索引贴 新的一年即将到来,不知不觉2015年自己在Jmeter方面总结的文章有十几篇,在此汇总一下,顺便也算是个总结吧。2016年,继续学习技术,总结,写文章。 一、基础部分: 使用Jmeter进行h…

类与接口(二)java的四种内部类详解

引言 内部类,嵌套在另一个类的里面,所以也称为 嵌套类; 内部类分为以下四种: 静态内部类成员内部类局部内部类匿名内部类一、静态内部类 静态内部类: 一般也称”静态嵌套类“,在类中用static声明的内部类。 因为是stat…

单例设计模式和多线程

单例设计模式 单例&#xff1a;整个项目中&#xff0c;有某个类或者某些特殊的类&#xff0c;属于该类的对象只能建立一个。 #include<iostream> using namespace std;class MyCAS { private:MyCAS(){}private:static MyCAS *m_instance;public:static MyCAS *GetInstanc…

运行imgui例程

背景&#xff1a;目前在做一个视觉测试系统&#xff0c;需要做一个界面&#xff0c;将相机获取的图像&#xff0c;以及测试过程中的数据呈现在界面上&#xff0c;在我印象里&#xff0c;做界面就用qt吧&#xff0c;直到这个月真要开始做界面了&#xff0c;我的领导给我建议用im…

性能测试总结(三)--工具选型篇

性能测试总结(三)--工具选型篇 本篇文章主要简单总结下性能测试工具的原理以及如何选型。性能测试和功能测试不同&#xff0c;性能测试的执行是基本功能的重复和并发&#xff0c;需要模拟多用户&#xff0c;在性能测试执行时需要监控指标参数&#xff0c;同时性能测试的结果不是…

创建一个最简单的imgui测试用例

在上一篇文章中&#xff0c;我们初步认识了一下imgui,并且成功运行了他提供的demo。这只是开始学习imgui的第一步&#xff0c;在实际使用时&#xff0c;我们需要将imgui应用到自己的工程中去&#xff0c;所以你需要具备将imgui加到你工程中去的能力&#xff0c;简单起见&#x…

idea中maven的setting.xml的配置

2019独角兽企业重金招聘Python工程师标准>>> <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

ref和out区别总结

ref&#xff1a;是必需要先初始化才能用,但调用时可以对它什么也不做.out&#xff1a;可以不初始化也能用,但调用时一定要对其赋值(即使已经初始化的也要赋值,哪怕是赋一个和原来一样的值).转载于:https://www.cnblogs.com/gjnsmallworld/p/7216206.html

继 承(面向对象特征之一)

1&#xff1a;成员变量。 当子父类中出现一样的属性时&#xff0c;子类类型的对象&#xff0c;调用该属性&#xff0c;值是子类的属性值。 如果想要调用父类中的属性值&#xff0c;需要使用一个关键字&#xff1a;super This&#xff1a;代表是本类类型的对象引用。 Super&…

如何将cv::Mat类型转换为imgui中的ImTextureID类型

背景&#xff1a; 我原来的工程是使用opencv的&#xff0c;所以程序中的图像都是表示为cv::Mat类型&#xff0c;为了能够在imgui窗口中显示我的cv::Mat的图像&#xff0c;我找到了下面这个函数&#xff1a; void ImGui::Image(ImTextureID user_texture_id, const ImVec2&…

react native 原生模块桥接的简单说明

原文出自&#xff1a;https://github.com/prscX/awes...博客链接&#xff1a;https://ssshooter.com/2019-02... Android 创建原生模块包 通过继承 ReactPackage 为你的原生模块包创建 Java 类&#xff0c;可以这么写&#xff1a;覆盖 createNativeModules 和 createViewManage…

UVa 1354 天平难题 枚举二叉树

题意&#xff1a;给出房间宽度 r 和 s 个挂坠的重量 wi&#xff0c;设计一个尽量宽的天平&#xff0c;挂着所有挂坠。天平由一些长度为 1 的木棍组成&#xff0c;木棍的每一端要么挂一个挂坠&#xff0c;要么挂另外一个木棍。 这题卡了很久&#xff0c;看了很多大神的代码&…

通过指针便利图像元素

for (size_t y 0; y < image.rows; y) {//row_ptr为第y行的头指针&#xff0c;unsigned char* row_ptr image.ptr<unsigned char>(y);for (size_t x 0; x < image.cols; x) {//data_ptr: 指向待访问像素unsigned char* data_ptr &row_ptr[x*image.channels…

[精华][推荐]SSO CAS单点登录框架学习 搭建详细步骤及源码

1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) &#xff0c;并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个) 2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进行。 2) SS…

电脑下载的M4A格式文件怎么转换为MP3格式

M4A文件格式并不是一个家喻户晓的名字&#xff0c;与&#xff2d;&#xff30;&#xff13;格式相比&#xff0c;知名度远远落后。但是&#xff0c;这并不意味着它无关紧要&#xff0c;有时候我们下载的音乐可能就是M4A格式的&#xff0c;如果换一个设备播放可能就会出现格式不…

python-for循环

一、功能 for 循环提供了python中最强大的循环结构&#xff08;for循环是一种迭代循环机制&#xff0c;而while循环是条件循环&#xff0c;迭代即重复相同的逻辑操作&#xff0c;每次操作都是基于上一次的结果&#xff0c;而进行的&#xff09; Python for循环可以遍历任何序列…

六、利用frp穿透连接内网的linx系统和windows系统

服务端的配置 # frps.ini [common] bind_port 7000 说明&#xff1a;防火墙放行该端口 启动&#xff1a;./frps -c ./frps.ini 后台启动&#xff1a;nohup ./frps -c ./frps.ini & 客户端的配置 (1)windows系统 # frpc.ini [common] server_addr x.x.x.x server_port 70…

根据相机内参进行图像去畸变

cv::Mat img; cv::Mat img_undistort; double fx,fy, cx, cy, k1, k2, p1, p2, k3;for(int v 0; v < img.rows; v){for(int u 0; u < img.cols; u){//根据内参数&#xff0c;计算归一化坐标系下的坐标点double x (u-cx)/fx;double y (v-cy)/fy;double r2 x*x y*y;/…

initialize方法与load方法比较

load方法和initialize方法类似点 1. 都只会调用一次2. 父类在子类之前加载 复制代码不同点在于&#xff1a; 1. 加载时间不同&#xff0c;load方法在main()函数前进行调用&#xff0c;initialize在第一次调用类的所属方法时在调用<可能永远不调用>。2. load方法不会被Cat…