安装streamlit

pip install streamlit==1.19.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

再安装pyinstaller

pip install pyinstaller==5.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

streamlit主程序为app.py

pyinstaller打包streamlit

创建一个hooks文件夹,在下面创建一个python文件(例如:hook-streamlit.py),代码如下:

from PyInstaller.utils.hooks import copy_metadata
 
datas = copy_metadata("streamlit")

然后在相同目录(app.py文件)下,创建一个run_app.py文件

然后输入以下代码:

import streamlit.web.cli as stcli
import os, sys
 
 
def resolve_path(path):
    resolved_path = os.path.abspath(os.path.join(os.getcwd(), path))
    return resolved_path
 
 
if __name__ == "__main__":
    sys.argv = [
        "streamlit",
        "run",
        resolve_path("app.py"),
        "--global.developmentMode=false",
    ]
    sys.exit(stcli.main())

先打包第一次:

注意要有以上三个文件

打包命令如下:(是在app.py文件夹目录下面打包

pyinstaller --onefile --additional-hooks-dir=./hooks run_app.py --clean

然后就会生成上面的run_app.spec这个文件,先将这时候的dist和build文件删掉。

打开run_app.spec文件(自带的记事本就可以打开),编辑下面部分

#添加下面部分
from PyInstaller.utils.hooks import collect_data_files
from PyInstaller.utils.hooks import copy_metadata
 
datas = [("你的streamlit安装位置/streamlit/runtime","./streamlit/runtime")]
datas += collect_data_files("streamlit")
datas += copy_metadata("streamlit")
 
 
block_cipher = None
 
#修改下面a里面的datas为=datas
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,
)

然后确认无误以后就开始的第二次打包,

输入以下指令:

pyinstaller run_app.spec --clean

然后会在dist文件夹下面,生成的run_app.exe文件,这时候运行会报错,找不到文件,只需要将前面的app.py文件复制到这个文件夹下面,就可以正常运行了。