在QT C++中呼叫 Python並將軟體打包釋出(裸機可執行)

馬兒的大煙槍發表於2021-02-12

      為了提高工作效率,需要一個可以自動生成多份相關聯的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文件進行操作 :

    https://blog.csdn.net/wcg541/article/details/100999756

 

  基本知道怎麼使用docx模組之後個人感覺參考官方文件會更適合自身的開發。

  Python docx:

     https://python-docx.readthedocs.io/en/latest/

 

 

二.QT中如何呼叫Python函式

    QT中使用C++呼叫python:

    https://www.cnblogs.com/shenghl/p/4442528.html

 

   常見問題:

    https://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

   這個操作在網上也是有很多文章這裡就不具體講了

   https://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檔案編譯不過)。

參考:

https://blog.csdn.net/spygg/article/details/104738799

https://blog.csdn.net/qq_34510308/article/details/83621237

 

相關文章