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.pswp.cn/news/252270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252270.shtml
英文地址,請注明出處:http://en.pswp.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…