Преобразуйте приложения Dash в графический интерфейс с помощью Pyinstaller, Selenium и Dash
Задний план
Вместо того, чтобы загружать приложение Dash на облачную платформу для распространения, вы можете преобразовать его в исполняемый файл в Windows или на Mac. В этом посте будут обсуждаться шаги, необходимые для получения стабильного исполняемого приложения Dash на вашем компьютере, которое вы можете распространять среди друзей или коллег.
Можно создать один файл приложения Dash и преобразовать его в исполняемый файл, как описано в этом сообщении сообщества Plotly, со следующим текстом в конце скрипта:
if __name__ == '__main__': Timer(1, open_browser).start(); # "open_browser" is the function that refers to a set of commands to let Selenium open a browser. app.run_server(debug=True, port=port)
По моему опыту, это помогло автоматически открыть браузер и затем запустить в нем приложение Dash, однако это привело к нестабильности приложения при преобразовании в исполняемый файл (также при изменении настроек отладки). Сработал следующий метод:
Метод
1. Установите Selenium и нужный веб-драйвер.
Первый шаг - установить пакет веб-автоматизации Selenium и скопировать веб-драйвер для браузера (например, Chrome), который вы хотите использовать, в нужный каталог (это / usr / bin или / usr / local / бункер). Позже нам понадобится селен для запуска браузера во время запуска исполняемого файла.
2. Добавьте дополнительный главный файл для приложения Dash.
Ключом к созданию стабильного исполняемого файла является создание дополнительного основного исполняемого файла, который вызывает приложение тире следующим образом:
Для этого сделайте следующее:
а. Создайте файл макета приложения: dash_app.py
Создайте файл dash_app.py, который запускает приложение Dash на локальном сервере.
import dash import dash_html_components as html app = dash.Dash(__name__, external_stylesheets=[dbc.themes.COSMO]) app.layout = html.Div(APP LAYOUT HERE) if __name__ == '__main__': app.run_server(host='0.0.0.0', port=8080, debug=False, use_reloader=False)
б. Создайте главный файл: main.py
Создайте файл main.py, который запускает браузер Selenium и вызывает указанный выше скрипт Python макета приложения:
import time from selenium import webdriver import subprocess import json import threading as thr def kill_server(): subprocess.run("lsof -t -i tcp:8080 | xargs kill -9", shell=True) # kill the server is a dash app is already running def start_dash_app_frozen(): path_dir = str(path.dirname(sys.executable)) subprocess.Popen(path_dir+"/dash_app", shell=False) # dash_app is the name that will be given to executabel dash app file, if your executable file has another name, change it over here... def start_driver(): driver = webdriver.Chrome() time.sleep(5) # give dash app time to start running driver.get("http://0.0.0.0:8080/") # go to the local server save_browser_session(driver) # save the browser identity info for giving future instructions to the browser (for instance opening up a new browser tab). print("DRIVER SAVED IN TEXT FILE browsersession.txt") def save_browser_session(input_driver): driver = input_driver executor_url = driver.command_executor._url session_id = driver.session_id browser_file = path_dir+"/browsersession.txt" with open(browser_file, "w") as f: f.write(executor_url) f.write("\n") f.write(session_id) def keep_server_running(): while True: time.sleep(60) print("Next run for 60 seconds") def main(): kill_server() # kill open server on port thread = thr.Thread(target=start_dash_app_frozen) thread.start() # start dash app on port start_driver() # start selenium controled chrome browser and go to port keep_server_running() # keep the main file running with a loop if __name__ == '__main__': main()
3. Компиляция «однофайлового исполняемого файла» main.py и «однофайлового исполняемого файла» dash_app.py и связанных папок с помощью Pyinstaller.
Установите pyinstaller:
pip install pyinstaller
Создайте файл install.sh. Сделайте его исполняемым с помощью команды:
chmod u+x install.sh
Затем напишите что-нибудь вроде следующего в дополнительном файле, чтобы облегчить себе жизнь:
Установочный файл: install.sh
#!/bin/sh echo "creating main executable file " pyinstaller --onefile --noconfirm main.py echo "moving main executable file" mv ./dist/main ./main rm main.spec echo "creating directory with files for application" pyinstaller --onedir --noconfirm dash_app.spec echo "moving main executable to directory" mv ./main ./dist/dash_app/ mv ./dist/dash_app/ ./finale_name_of_app_dir echo "executable creation completed, press enter to continue" read input
Перед запуском вышеуказанного создайте файл спецификации, содержащий переменные (такие как включенные файлы, пакеты и т. Д.), Которые Pyinstaller собирается развернуть для производства исполняемого файла. Используйте следующую команду в приглашении, чтобы создать файл спецификации:
pyinstaller dash_app.spec
Теперь измените содержимое файла спецификации, чтобы включить в него важные файлы. В файле спецификации используется синтаксис Python. Вы можете найти более подробную информацию о спецификациях здесь.
Файл конфигурации установки: dash_app.spec
... ... ... added_files = [ ('parameters.json', '.' ), # of course do NOT add your secrets.json file if you are planning to distribute the executable ('testenv.json', '.' ), ('state.json', '.'), ('./venv/lib/python3.8/site-packages/dash_daq', './dash_daq'), ] # add for instance a package that is not automatically included to the one-dir package by Pyinstaller. ... ... ...
4. Беги
./install.sh
Результаты
Гифка, которая показывает результат:
Спасибо за чтение и удачи в преобразовании вашего приложения! Дайте мне знать в комментариях, если у вас возникнут вопросы.
Больше контента на plainenglish.io