1. 程式人生 > 其它 >Python 打包程式碼為 .exe 檔案(包括靜態js、html打包)

Python 打包程式碼為 .exe 檔案(包括靜態js、html打包)

準備工作

使用 pyinstaller 打包
pip install pyinstaller
詳細用法可參考 https://realpython.com/pyinstaller-python/
pyinstaller 網上教程一堆,這裡只列常用命令供快速查閱

引數說明

--name -n 重新命名,不需要加字尾,自帶.exe

pyinstaller cli.py --name realpython

--onefile -F 打包成一個檔案。dist資料夾下只會出現一個exe檔案

pyinstaller cli.py --onefile

--hidden-import 使函式內部的 import 依賴和 import

() 方法可用
後面需要加模組名稱,可以使用多次。如果是檔案開頭使用 import 沒有影響。也就是說除非你在 main 函式裡面寫一些 import,需要用到這個命令,正常在檔案開頭 import 是不需要用的。

pyinstaller cli.py --hiddenimport=requests --hiddenimport=numpy

--add-data--add-binary 打包附加資料或者lib
例如打包 configuration files examples, or other non-code data
重要引數,解決你打包以後程式碼裡面讀寫檔案、引用js檔案總是找不到路徑的問題。


(以下資訊來自 StackOverflow)

  • format: {source}{os_separator}{destination}(destination 是資料夾路徑)
    • os_separator:
      • Windows: ;
      • Mac/Linux/Unix: :(Windows下是分號,Linux等是冒號)
    • source and destination
      • Logic:
        • source: path to single or multiple files, supporting glob syntax. Tells PyInstaller where to find the file(s).
        • destination file or files: destination folder which will contain your source files at run time. * NOTE: NOT the destination file name.
          • folder: destination folder path, which is RELATIVE to the destination root, NOT an absolute path.
  • Examples:
    • Single file: src/README.txt:.(打包單個檔案,相對路徑)
    • multiple files: /mygame/sfx/*.mp3:sfx(打包多個依賴檔案)
    • folder: /mygame/data:data(打包資料夾)

打包外部 js、html的時候需要在py檔案中使用相對路徑。(複製下面的程式碼即可)

import os
import sys
# 獲取資源路徑
def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

# 使用後,會自動獲取臨時資料夾下的資原始檔,而不再需要外接靜態資原始檔C:\Users\vana\AppData\Local\Temp\_MEI286322\./ids-encrypt.js
# windows系統下,當前資料夾內資源打包
pyinstaller cli.py --add-data ids-encrypt.js;.

--exclude-module 排除模組
例如一些開發時依賴,比如 pytest 等

pyinstaller cli.py --exclude-module=pytest

-w 去掉執行時的cmd視窗。有介面的程式可使用,cmd程式勿用

pyinstaller cli.py -w