Hello,
I just cannot manage to package a simple Streamlit app (a library for creating browser-based GUIs). I have read through all the material on the Pyinstaller website and the Github wiki.
This is my main.py:
import streamlit as st
st.text("This program is running")
and this is my wrapper.py:
import subprocess
from pathlib import Path
import sys
def resource_path(relative_path):
try:
base_path = Path(sys._MEIPASS)
except AttributeError:
return relative_path
return base_path.joinpath(relative_path).as_posix()
main_script_path = resource_path("main.py")
with open('streamlit_output.txt', 'w') as f_out, open('streamlit_error.txt', 'w') as f_err:
subprocess.run(f'streamlit run "{main_script_path}"',
stdout=f_out, stderr=f_err, check=True, shell=True)
Running this wrapper locally works.
To package it with Pyinstaller I first run pyi-makespec --onedir -w --additional-hooks-dir=hooks --add-data "main_st.py;." --hidden-import=streamlit --debug=all wrapper_st.py.
My hook-streamlit.py looks like this:
from PyInstaller.utils.hooks import copy_metadata, collect_submodules
datas = copy_metadata("streamlit")
hiddenimports = collect_submodules('streamlit')
I then modify the spec file datas section as follows (some people online said that this was necessary):
a = Analysis(
['wrapper_st.py'],
pathex=[],
binaries=[],
datas=[('main_st.py', '.'),
('C:/Users/jusc_da/venvs/airfucs-calc-311/Lib/site-packages/altair/vegalite/v5/schema', './altair/vegalite/v5/schema'),
('C:/Users/jusc_da/venvs/airfucs-calc-311/Lib/site-packages/streamlit/static', './streamlit/static')],...
Finally I build the exe by running pyinstaller wrapper_st.spec --clean --noconfirm.
When double clicking the resulting exe, nothing happens. The streamlit_error.txt file contains:
'streamlit' is not recognized as an internal or external command,
operable program or batch file.
What am I doing wrong?