1. 程式人生 > >cx_freeze打包python3.6成exe/msi應用

cx_freeze打包python3.6成exe/msi應用

前言

因專案需要使用客戶端採集使用者資料庫表資訊,需要提供給客戶在本地執行採集,因此使用了python編寫了程式,打包成可執行檔案供使用者下載使用。編寫了使用了最新版本的python3.7,打包時各種問題,第一次接觸也解決不了,百度了一大圈,很多人說打包工具不支援3.7版本,果斷換了3.6.4的版本,程式碼都不用改動,直接下載對應的依賴庫就行了。

打包工具

打包工具有Pyinstaller/py2exe/cx_freeze,各種版本都有人使用,有人也說前兩種不支援3.x的,我也沒去一個個測試,坑太多,怕會懷疑人生,直接上手cx_freeze。

cx_freeze

版本我直接下載了最新版本:5.1.1,也有人說要對應版本,我的pthon和cx_freeze幾乎都是最新的,反正cx_freeze5.1.1與pthone3.6.4組合成功了。cx_freeze想著介紹可以看官網:

傳送門 失效請點選:http://cx-freeze.readthedocs.io/en/latest/
知道他幾個屬性就差不多了。

setup.py編寫

因為我使用到tkinter編寫GUI,所以編寫setup.py檔案來做配置項:檔案如下:

import sys
import os.path
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'
] = os.path.join(PYTHON_INSTALL_DIR, 'tcl','tcl8.6') os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl','tk8.6') # Dependencies are automatically detected, but it might need fine tuning. build_exe_options = {"packages": [ "os","tkinter","pymysql"], "includes": ["tkinter"
], 'include_files':[ os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), ] } # GUI applications require a different base on Windows (the default is for a # console application). base = None if sys.platform == "win32": base = "Win32GUI" #"bdist_msi": bdist_msi_options setup( name = "xxxxx", version = "0.1", description = "My GUI application!", options = {"build_exe": build_exe_options}, executables = [Executable("Main.py",shortcutName="xxxxx",shortcutDir="DesktopFolder", base=base)])

因為使用到tkinter,所以配置了tcl與tk和相關引數,tcl一般情況也與python安裝一起安裝了,如果沒有安裝的話需要單獨安裝,並把路徑設定正確,確保正確。
python3.6使用的是pip3命令,如果使用pip命令安裝的依賴包,執行能執行,打包後會報錯,找不到依賴包,這種情況重新使用pip3安裝。

桌面快捷鍵

使用者安裝成功後一般需要生成桌面快捷方式,簡單的配置只需要在Executable下配置其相關引數,需要配置引數有:shortcutName,shortcutDir,shortcutName顯示快捷應用的名字,shortcutDir設定存放快捷圖示的目錄,系統已經內建的目錄大體有:DesktopFolder,MenuDir,TARGETDIR,對應桌面、開始選單,應用安裝目錄三個檔案目錄,一般使用的都是DesktopFolder目錄,配置好之後如果打包安裝後會在桌面生成快捷方式,但是執行會報錯,右鍵檢視屬性會發現他的起始目錄是空的,手動新增起始目錄為他的安裝目錄會成功執行,但是使用者不可能手動去新增,所以我們需要修改cx_freeze的有關生成快捷方式的程式碼,新增對應的目錄進去,修改檔案為:windist.py,位置在:python安裝目錄/Lib/site-packages/cx_Freexe目錄下。檔案中的add_config方法:
修改前:

msilib.add_data(self.db, "Shortcut",
                        [("S_APP_%s" % index, executable.shortcutDir,
                                executable.shortcutName, "TARGETDIR",
                                "[TARGETDIR]%s" % baseName, None, None, None,
                                None, None, None, None)])

修改後:

msilib.add_data(self.db, "Shortcut",
                        [("S_APP_%s" % index, executable.shortcutDir,
                                executable.shortcutName, "TARGETDIR",
                                "[TARGETDIR]%s" % baseName, None, None, None,
                                None, None, None, "TARGETDIR")])

把最後一個引數None變了“TARGETDIR”,這樣生成的快捷方式就能正常運行了,起始位置也正常了。

打包

python setup.py bdist_msi

如果不出意外的話,安裝包就正常能安裝運行了。