title: python使用pyinstaller製作桌面應用程式 date: 2024-06-26 tags:

  • python
  • pyinstaller updated: 2024-06-26 up:
  • "[[cross-platform]]"

  • 先看 File structure:
# app.py
import streamlit as st

st.title('Hello World')
# hooks/hook-streamlit.py

from PyInstaller.utils.hooks import copy_metadata

datas = copy_metadata("streamlit")
# run_app.py

import streamlit

import streamlit.web.cli as stcli

import os, sys

if __name__ == "__main__":

os.chdir(os.path.dirname(__file__))

sys.argv = [

"streamlit",

"run",

"./src/app.py",

"--global.developmentMode=false",

]

sys.exit(stcli.main())

method 1: 第一次打包

pyinstaller --onefile --additional-hooks-dir=./hooks run_app.py --clean 第二次打包

method 2:

pyi-makespec run_app.py 會產生run_app.spec

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

from PyInstaller.utils.hooks import collect_data_files
from PyInstaller.utils.hooks import copy_metadata

datas = [("/Users/alantseng/.pyenv/versions/3.12.4/lib/python3.12/site-packages/streamlit/runtime", "./streamlit/runtime")]
datas += collect_data_files("streamlit")
datas += copy_metadata("streamlit")
datas += [('./src', './src')]



block_cipher = None


a = Analysis(
    ['run_app.py'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=[],
    hookspath=['./hooks'],
    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='run_app',
    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,
)
  • notes: /Users/alantseng/.pyenv/versions/3.12.4/lib/python3.12/site-packages 這個可以看 :
    • python -c 'import site; print(site.getsitepackages())'
  • pyinstaller run_app.spec --clean

加上docx

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

from PyInstaller.utils.hooks import collect_data_files
from PyInstaller.utils.hooks import copy_metadata
import sys
from os import path
site_packages = next(p for p in sys.path if 'site-packages' in p)

datas = [("/Users/alantseng/.pyenv/versions/3.12.4/lib/python3.12/site-packages/streamlit/runtime", "./streamlit/runtime")]
datas += collect_data_files("streamlit")
datas += copy_metadata("streamlit")
datas += collect_data_files("python_docx")
datas += copy_metadata("python_docx")
datas += collect_data_files("docx")
datas += copy_metadata("docx")
datas += [('./src', './src')]
datas +=[(path.join(site_packages,"docx","templates"), "docx/templates")]

block_cipher = None


a = Analysis(
    ['run_app.py'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=["python_docx", "docx"],
    hookspath=['./hooks'],
    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='run_app',
    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,
)

Ref