1. cx_Freeze簡介
Python腳本在裝有Python的系統中可以直接雙擊運行,但絕大多數普通用戶並沒有配置此類環境,而編譯為可執行二進制文件后,用戶無需預先安裝Python及依賴庫即可像運行普通程序一樣運行編寫好的Python代碼。有相當數量的Python庫可以實現此類轉換,此文檔主要對cx_Freeze的使用進行總結分享。
2. cx_Freeze包更替
cx_Freeze官方下載網站:https://pypi.org/project/cx-Freeze/#files
2.1 版本升級
從cx_Freeze官方下載網站根據所使用的Python版本以及PC機系統位數選擇相對應的安裝包進行下載。目前PC機均已經安裝了cx_Freeze包(cx_Freeze_6.1),若要升級到官方最新版本,可直接先在Python路徑下(C:\Python37\Lib\site-packages)將當前版本中“cx_Freeze”和“cx_Freeze-6.1.dist-info”兩個文件夾刪除。刪除后在所下載安裝包路徑下通過cmd指令“pip install cx_Freeze-6.2-cp37-cp37m-win_amd64.whl”進行安裝。安裝后Python路徑下會自動生成新的cx_Freeze包。
2.2 版本回退
由於Python版本的不斷迭代更新,不同第三方庫可能並沒有對當前最新Python版本中相應的內容進行適配。即,有些第三方庫需要與相對應的Python版本對應使用才能正常執行所需功能。因此,有時需要將第三方庫回退到之前對應的版本。目前,cx_Freeze官方下載網站只提供最新版本而不提供舊版本的下載。所以要想將版本回退到舊版本,同樣先將當前路徑中已有的cx_Freeze包刪除,再cmd指令“pip install cx-Freeze==6.0”進行想要版本的安裝。
3. cx_Freeze提供的實例
cx_Freeze模塊安裝好后,會在site-packages的cx_Freeze模塊包中會提供部分模塊的打包實例。具體路徑為:C:\Python37\Lib\site-packages\cx_Freeze\samples。
3.1 PyQt5實例
以cx_Freeze提供的PyQt5實例進行分析。
3.1.1 腳本編寫
雖然提供的實例是PyQt5,但因其只是一個測試實例,所以內部只進行了一個普通窗體的實現。PyQt5實現過程與PySide2基本相同(大體只在GPLv3協議與LGPL協議的差異)。所以,直接將內部調用的“from PyQt5.QtWidgets import QApplication, QWidget”改為“from PySide2.QtWidgets import QApplication, QWidget”進行測試。
實例中的setup腳本如圖3-4所示。整體由三塊組成,即,
1:導入所需要的模塊。
2:setup各參數的配置。
- l Name:所要打包生成.msi的名稱。
- l Version:所要打包生成.msi的版本號(版本號需要以純數字形式進行設置)。
- l Description:對產品進行描述。
- l Options:對生成路徑以及內部具體包含和壓縮的模塊進行設置(所有具體模塊的包含與排除均在options中配置)。
- l Executables:工程的入口函數以及打包生成.msi文件的圖標等進行設置。
3:options內部各具體命令的配置。
- l Base用來判斷是否為Windows系統。
- l Options中為distutils命令,該實例中只用了其中“build_exe”命令。即,將想要包含的模塊進行打包。
- l Executables為調用所用到的工程文件“PyQt5app.py”。
3.1.2 程序打包
通過命令python3 setup.py bdist_msi 打包程序,並創建build子目錄的同時,還會自動創建dist子目錄,里面包含.msi安裝包,包含了應用程序cx_freeze包括的所有文件。其中,\build\lib目錄下包含了所有被打包的模塊文件。Library.zip中壓縮了所有需要被打包壓縮的文件。
從圖中可以看出,還有大部分模塊並沒有被壓縮進library.zip文件中,其中,PySide2占據了較大的體積空間,因此,在2.1.1節中,應對options做具體的壓縮命令配置。
- zip_include_packages: 壓縮文件中應包含的軟件包。使用“*”將所有要包含的模塊進行壓縮存入zip文件中。
- zip_exclude_packages: 應被排除在壓縮文件之外的軟件包。使用“*”將所有模塊排除在壓縮的zip文件之外。
經過壓縮后,所有之前打包但並沒有被壓縮的模塊均已被壓縮至library.zip中,且.msi安裝包有了明顯的縮小。