Преобразуйте приложения 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