Вопрос или проблема
Я работаю над проектом на Python, который требует от меня разработки графического интерфейса с использованием streamlit для приема пользовательского ввода и выполнения некоторых расчетов с помощью скриптов octave, а также отображения результатов в графическом интерфейсе streamlit. Я упаковал все приложение с помощью pyinstaller, и исполняемый файл работает полностью нормально на моем ПК. Но когда я отправил исполняемый файл вместе со всей папкой проекта на другой ПК, появилась ошибка “streamlit не распознается как внутренняя или внешняя команда, выполняемая программа или пакетный файл.” На этом ПК установлен octave и python. Я прикрепляю файл .spec
для справки.
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_all, copy_metadata
datas = []
binaries = []
hiddenimports = []
tmp_ret = collect_all('debugpy')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all('octave_kernel')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all('streamlit')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all('oct2py')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all('multiprocessing')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all('PIL')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all('streamlit_option_menu')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
hiddenimports += [
'streamlit',
'streamlit.runtime.scriptrunner.script_run_context',
'streamlit.components.v1',
'streamlit.runtime.legacy_caching.hashing',
'streamlit.proto',
'streamlit.type_util',
'streamlit.server.server',
'streamlit.logger',
]
datas += copy_metadata('streamlit_extras')
datas += [('Frontend/*', 'Frontend'),('Frontend/pages/*', 'Frontend/pages'),('backend_codes/*', 'backend_codes'),('Plots/', 'Plots'), ('variable_text_files/*', 'variable_text_files')]
a = Analysis(
['my_app.py'],
pathex=[],
binaries=binaries,
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name="BulletTrain",
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,
)
Как убедиться, что исполняемый файл работает правильно на другом ПК?
Я перечислил каждый модуль и пакет, использованный в проекте, в разделе hiddenimports, ничего больше не упустил. Все равно не работает..
Ответ или решение
Чтобы корректно распределить ваше приложение, сгенерированное с помощью PyInstaller, на других компьютерах, вам нужно учитывать несколько вещей. Ошибка, которую вы получили ("streamlit is not recognized as an internal or external command, operable program or batch file"), указывает на то, что система не находит команду Streamlit. Вот шаги, которые помогут вам убедиться, что ваше приложение будет работать на другом ПК.
Шаги для правильной упаковки и распределения:
-
Убедитесь в включении всех зависимостей:
Ваш .spec файл кажется достаточно полным, но убедитесь, что все зависимости действительно включены в сборку. Используйте параметр--onefile
при запуске PyInstaller, чтобы обеспечить максимальную независимость от системы. -
Использование виртуального окружения:
Определённо рекомендуется использовать виртуальное окружение (например,venv
илиconda
) для установки всех необходимых библиотек. Это поможет избежать конфликта с другими версиями библиотек, установленными на целевой машине.python -m venv myenv source myenv/bin/activate # В Linux/Mac myenv\Scripts\activate # В Windows pip install -r requirements.txt
-
Проверка доступности команд:
Ваша программа может зависеть от того, как пользователь должен вызывать командуstreamlit
. Убедитесь, что у других пользователей есть доступ к команде в терминале. Это можно сделать, добавив путь к папке, где установлен Streamlit, в переменную окружения PATH на целевой машине.Чтобы проверить, установлен ли Streamlit корректно, пользователю нужно выполнить:
streamlit --version
-
Запись правильного пути в
PATH
:
Если вы развертываете приложение на Windows, вам может потребоваться добавить путьScripts
вашей установки Python в переменную окруженияPATH
. Можно сделать это следующим образом:- Откройте "Панель управления" > "Система и безопасность" > "Система".
- Нажмите "Дополнительные параметры системы".
- В диалоговом окне "Системные свойства" перейдите на вкладку "Дополнительно" и нажмите "Переменные среды".
- Найдите переменную
PATH
и добавьте путь кScripts
, который, скорее всего, будет похож на:C:\Users\<username>\AppData\Local\Programs\Python\PythonXX\Scripts
-
Создание дистрибутива:
Используйте следующую команду для создания дистрибутива приложения:pyinstaller --onefile --add-data "Frontend/*;Frontend" --add-data "backend_codes/*;backend_codes" --add-data "Plots/*;Plots" --add-data "variable_text_files/*;variable_text_files" my_app.py
-
Тестирование:
Протестируйте сгенерированный файл на другом компьютере, убедившись, что все зависимости установлены и правильно настроены. -
Документация для пользователя:
Предоставьте пользователю инструкции по установке необходимых инструментов (Python, Octave, Streamlit) и как запустить вашу программу. Обратите внимание на необходимость наличии соответствующих версий библиотек. -
Исключение возможных ошибок:
Убедитесь, что все настройки и зависимости проверены и что другие пользователи имеют необходимые разрешения для запуска исполняемого файла.
Следуя этим шагам, вы сможете обеспечить стабильную работу вашего приложения на других компьютерах без каких-либо проблем. Если возникнут дополнительные ошибки, собирайте журнал вывода для диагностики и анализа проблем с запуском.