python pyinstaller庫

2023-04-24 18:01:24

簡要

pyinstaller模組主要用於python程式碼打包成exe程式直接使用,這樣在其它電腦上即使沒有python環境也是可以執行的。

用法

一.安裝

pyinstaller屬於第三方庫,因此在使用的時候需提前安裝

pip install pyinstaller

二.設定spec檔案

1.設定生成exe程式資料夾

(1)如果不熟悉spec設定內容,可以在終端執行如下指令生成固定模板

pyinstaller --name myapp main.py  # myapp為生成的spec檔名稱,main.py為打包的檔案

(2)執行完後我們會看見如下幾個檔案,dist和build直接刪除即可。我看開啟myapp.spec檔案可以看見設定資訊。

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(
    ['main.py','hello.py'],  注:要打包的模組,按照先後順序執行
    pathex=['C:/Users/pythonProject'],  注:要打包的Python原始碼的路徑列表。
    binaries=[],  注:
    datas=[],  注:要打包的非Python資源(例如影象、組態檔等)列表。
    hiddenimports=[''requests],  注:必需的隱藏匯入列表,用於告訴PyInstaller找到其他未明確指定的依賴項。
    hookspath=[],  注:一個路徑列表,其中包含指定要自定義的勾點模組的目錄。
    hooksconfig={},  注:
    runtime_hooks=[],  注:用於在應用程式執行時執行的Python程式碼檔案列表。
    excludes=[],  注:不包括在生成的可執行檔案中的模組列表
    win_no_prefer_redirects=False,  注:
    win_private_assemblies=False,
    cipher=block_cipher,  注:用於加密Python位元組碼的密碼。
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
注:
a.pure: 一個布林值,指示是否生成純Python位元組碼。如果為True,則PyInstaller將不包括任何二進位制檔案或庫。

     a.zipped_data: 用於包含OneFile模式下的所有Python指令碼和資源的元組。


exe = EXE(
    pyz,  注:一個PYZ範例,其中包含要打包的所有Python指令碼和資源。
    a.scripts,  注:應用程式的主Python指令碼列表。
    [],
    exclude_binaries=True,
    name='myapp',  注:生成exe可執行檔案的名稱
    debug=False,  注:一個布林值,指示是否生成偵錯版本的可執行檔案
    bootloader_ignore_signals=False,  注:一個布林值,指示是否忽略啟動載入器的訊號。
    strip=False,  注:一個布林值,指示是否對可執行檔案進行符號剝離。
    upx=True,  注:一個布林值,指示是否使用UPX壓縮可執行檔案
    console=True,  注:是否開啟dos視窗
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
   icon:'圖示.ico' 注:使用者生成exe檔案的封面,字尾必須是ico格式,轉換地址:https://convertio.co/zh/download/88c5806204642c8a1c10e65b1bef9b5886f6d8/ ) coll
= COLLECT( exe, 注:你的Python指令碼生成的可執行檔案路徑(通常是與spec檔案同名的檔案) a.binaries, 注:二進位制物件列表,表示其他相關二進位制檔案的位置以及將它們複製到輸出目錄的相對路徑。例如,如果您的應用程式需要音訊或影象檔案,則可以使用此引數將其包含在可執行檔案中。 a.zipfiles, 注:壓縮檔案列表,表示應該從zip檔案中提取哪些檔案並將它們放入輸出目錄。這對於打包一些必需的庫或資料檔案非常有用。 a.datas, 注:資料檔案列表,這些檔案不應被壓縮,但應該被複制到輸出目錄中。例如,這可能包括組態檔、模板檔案或其他型別的文字檔案。 strip=False, 注:是否從可執行檔案和庫中去除偵錯資訊。預設情況下為True,這將減小檔案大小,但會使得偵錯更加困難。 upx=True, 注:是否使用UPX來壓縮可執行檔案和庫。預設情況下為False,因為UPX可能會導致某些檔案無法正常工作。 upx_exclude=[], 注: name='myapp', 注:打包資料夾名稱。 )

(3)通常我們只需要設定需要打包的模組+pathex+生成exe檔案的名稱+exe存在目錄的名稱,設定完後直接在終端

         輸入指令進行打包。

pyinstaller  myapp.spec

(4)打包完成後在專案所在目錄下可以看下dist檔案,dist檔案下一目錄就是打包資料夾,資料夾下面就是所在的

         程式。這裡需要注意的是,因為我們打包的是資料夾,因此發給別人使用的時候,因把整個資料夾發過去,

         才能正確執行。

 (5)設定要打包的模組,若模組之間存在import連線,可直接打包最終(main)執行的那個模組即可,pyinstaller會

           預設把main涉及的impor(.py+第三方庫)全部一起打包。若兩個py模組相互沒有任何關聯,這個時候可以打

          包多個。

2.設定生成獨立的exe檔案

(1)這裡和上面步驟一樣,先生成模板

pyinstaller -F main.py

(2)模板大概樣式如下,欄位意思和上面一致。

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='hello',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

(3)設定完成後終端執行指令打包,打包完成後會看見dist目錄下只有一個exe檔案。

pyinstaller  myapp.spec

三.除了設定spec檔案,還可以直接通過pyinstaller指令來直接打包,這裡就不做多介紹了。