在QT C++中調用 Python並將軟體打包發布(裸機可運行)
為了提高工作效率,需要一個可以自動生成多份相關聯的word文檔免去繁瑣複製粘貼工作的軟體。最後選定使用QT C++做介面和主要邏輯程式設計,對word的操作使用python寫好對應的函數,然後在QT中調用自己寫好的python函數完成相應的功能。由於這是第一次使用python 也是第一次將python嵌入QT中使用所以心中有以下幾個疑慮:
1.Python是如何操作word文檔的
2.QT中如何使用Python函數
3.按照QT程式的發布流程發布,是否會不兼容Python 使得軟體無法運行
對於如何使用python和如何在QT中調用pthon網上已經有許多寫的很好的文章了,這裡會放上我學習參考的文章鏈接。本篇隨筆主要記錄,探討在QT中調用python語言後的軟體發布。
一.Python如何操作word文檔
Python操作word文檔我使用了docx模組
教你怎麼使用Python對word文檔進行操作 :
//blog.csdn.net/wcg541/article/details/100999756
基本知道怎麼使用docx模組之後個人感覺參考官方文檔會更適合自身的開發。
Python docx:
//python-docx.readthedocs.io/en/latest/
二.QT中如何調用Python函數
QT中使用C++調用python:
//www.cnblogs.com/shenghl/p/4442528.html
常見問題:
//blog.csdn.net/herr_kun/article/details/84570258
三.QT調用Python後如何發布程式
按照上面的兩個文章程式碼的主要功能都實現的差不多了,這時候心裡開始擔心這次QT C++程式內調用了另外的一種語言,使用QT的windeployqt.exe發布程式只包含了QT所需要的環境對於Python的環境並沒有打包,這樣會導致在沒有安裝Python的電腦上無法運行。把網上的文章基本都看過一次之後還是沒能解決,最終結合了多篇文章的做法自己又摸索了幾天終於解決了在裸機上無法運行的問題。下面先講講發布的流程:
1.製作python環境文件夾
1.本次開發使用python3.7。首先新建一個文件夾,命名為 「Python37」。
2.打開python安裝目錄如下:
3.複製文件夾內的所有.dll文件,DLLs,include,Lib,libs 文件夾到第一步新建的Python37文件夾內,複製好後如下圖:
4.將Python37文件夾複製到QT的release文件夾下(就是那個名字很長的文件夾)如下圖:
2.在C++程式碼中使用 Py_SetPythonHome 函數指定python庫 解釋器的路徑
Py_SetPythonHome((wchar_t *)(L"./Python37"));
Py_Initialize();
if ( !Py_IsInitialized() )
{
printf("Cant Py_IsInitialized !\n");
return ;
}
在調用python相關函數之前,先使用 Py_SetPythonHome((wchar_t *)(L“./Python37“)) 指定好Python的庫和解釋器的位置。這裡寫的是在當前目錄下的Python37文件夾(網上的文章用的是壓縮包,我嘗試使用壓縮包出錯,並且python37文件夾和python37壓縮包放在一起還會導致python37文件夾找不到)。
如果沒有將第一步製作的Python37文件夾放對位置或者Python37文件夾有問題編譯會報錯。
3.使用windeployqt.exe打包QT
這個操作在網上也是有很多文章這裡就不具體講了
//blog.csdn.net/Zhenggenno_1/article/details/80459066
4.拷貝相關文件到發布好的QT文件夾中
在第3步中我生成了demo1.2文件夾,將我們第一步製作好的Python37文件夾,程式中使用到的.py文件以及Python37中的python3.dll python37.dll文件一起複制到demo1.2文件夾內。如下圖,圈出的是需要複製到demo1.2中的文件:
至此,打包完成。
四.小結
1.使用Py_SetPythonHome 函數將python的庫和解釋器指定路徑必不可少,之前按照網上很多方法都沒有提及Py_SetPythonHome 函數的使用,如果在調試階段Py_SetPythonHome 函數的傳參可以設置為python的安裝目錄。
2.本次使用的打包方法(製作Python37文件)缺點在於文件夾較大,網上有說使用Pyinstaller和py2exe先發布python程式發布後會生成dis文件夾和base_library壓縮包代替這裡製作的Python37文件夾,但是我始終沒成功。
3.PyImport_ImportModule突然報錯時,檢查下.py文件是否有問題(有可能修改後多了空格之類的導致.py文件編譯不過)。
參考:
//blog.csdn.net/spygg/article/details/104738799
//blog.csdn.net/qq_34510308/article/details/83621237