添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

当我们要运行Streamlit应用时,一般是通过命令行输入“streamlit run xxx.py”的方式。其实这样的操作已经很简单了,但是如果你还想再操作简单的话,那我们不妨试着将Streamlit应用变成一个可执行的exe文件,双击执行即可启动它。

  • 首先安装PyInstaller,推荐使用4.9版本,我们会用这个工具将Streamlit应用打包成exe文件,安装命令是“pip install pyinstaller”;
  • 对Streamlit的启动文件(假设是app.py)进行封装,新建一个新的文件(假设叫run_app.py)。这样后面,我们会通过执行run_app.py文件而不是原先的app.py文件来启动Streamlit应用。run_app.py的代码如下显示:
  • 1 import streamlit
    2 import streamlit.cli
    3 from streamlit import bootstrap
    5 if __name__ == '__main__':
    6     streamlit._is_running_with_streamlit = True
    7     bootstrap.run('app.py', 'streamlit run', [], {})
  • 创建PyInstaller的Hook文件(假设叫hook_streamlit.py,放在hooks文件夹内),用于将streamlit包打包进可执行的exe文件中。hook_streamlit.py的代码如下显示:
  • 1 from PyInstaller.utils.hooks import copy_metadata
    2 datas = copy_metadata('streamlit')
  • 创建Streamlit应用的全局配置文件config.toml(放在.streamlit文件夹内),用于设置Streamlit应用的主题颜色、字体以及端口号等。config.toml的内容如下显示:
  • [theme]
    primaryColor="#1576fe"
    backgroundColor="#FFFFFF"
    secondaryBackgroundColor="#F5F7FA"
    textColor="#212121"
    font="sans serif"
    [server]
    port=8552
    headless=true
    [browser]
    gatherUsageStats = false
    [global]
    developmentMode = false
  • 通过命令“pyinstaller --onefile --additional-hooks-dir=./hooks run_app.py --clean”生成run_app.spec文件,后面会修改该文件并以此生成可执行的exe文件。我们对生成后的run_app.spec文件进行datas值的设置(初始时datas=[]),具体的内容如下显示:
  •  1 # -*- mode: python ; coding: utf-8 -*-
     4 block_cipher = None
     7 a = Analysis(
     8     ['run_app.py'],
     9     pathex=[],
    10     binaries=[],
    11     datas=[(
    12             "{$YOURPYTHONENV}/Lib/site-packages/altair/vegalite/v4/schema/vega-lite-schema.json",
    13             "./altair/vegalite/v4/schema/"
    14         ),
    15         (
    16             "{$YOURPYTHONENV}/Lib/site-packages/streamlit/static",
    17             "./streamlit/static"
    18         )
    19     ],
    20     hiddenimports=[],
    21     hookspath=['./hooks'],
    22     hooksconfig={},
    23     runtime_hooks=[],
    24     excludes=[],
    25     win_no_prefer_redirects=False,
    26     win_private_assemblies=False,
    27     cipher=block_cipher,
    28     noarchive=False,
    29 )
    30 pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
    32 exe = EXE(
    33     pyz,
    34     a.scripts,
    35     a.binaries,
    36     a.zipfiles,
    37     a.datas,
    38     [],
    39     name='run_app',
    40     debug=False,
    41     bootloader_ignore_signals=False,
    42     strip=False,
    43     upx=True,
    44     upx_exclude=[],
    45     runtime_tmpdir=None,
    46     console=True,
    47     disable_windowed_traceback=False,
    48     argv_emulation=False,
    49     target_arch=None,
    50     codesign_identity=None,
    51     entitlements_file=None,
    

    其中{$YOURPYTHONENV}指的是你实际的python环境的路径,比如“C:/Python39”。

  • 通过命令“pyinstaller --onefile --additional-hooks-dir=./hooks run_app.spec --clean”生成可执行的exe文件,该exe文件会在dist文件夹中。最终的文件夹结构如下显示:
  • WORKINGDIR/
        - .streamlit/
            - config.toml
        - hooks/
            - hook-streamlit.py
        - app.py
        - run_app.py
        - run_app.spec
        - build/
            - run_app/
                - many .toc and .pyz
        - dist/
            - run_app.exe
  • 记住将.streamlit文件夹和app.py文件拷贝到dist文件夹中,这样在dist文件夹中执行exe文件时,不会报缺少文件的错误。
  • 最后展示一下我的Streamlit应用的启动和显示界面。