Как я могу включить ресурсы приложения dash в exe-файл, созданный с помощью pyinstaller —onefile?

#python #python-3.x #pyinstaller #plotly-dash

#python #python-3.x #pyinstaller #plotly-dash

Вопрос:

Я пытаюсь упаковать приложение dash в один файл pyinstaller .exe и сталкиваюсь с некоторыми проблемами, включая папку assets.

Вот что я сделал до сих пор:

 # get temp working directory
    import sys
    import os
    def resource_path(relative_path):

# get absolute path to resource
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

print(resource_path("assets"))
  

Это дает мне путь к текущему рабочему каталогу / ресурсам. Он работает как в среде anaconda, так и в .exe, предоставляя мне правильный путь в консоли.

Но в следующей части у меня возникают проблемы:

 # create app
app = dash.Dash(__name__, assets_url_path=resource_path("assets"))
  

Обычно assets_url_path= может использоваться для установки пути к ресурсам для приложений dash. В частности, здесь хранится мой css-файл для форматирования, но это должен быть один и тот же процесс для любого ресурса. Однако по какой-то причине ресурсы не используются в версии приложения pyinstaller, несмотря print(resource_path("assets")) на то, что в системном каталоге указан правильный путь Temp . Я даже могу перейти туда и посмотреть my styles.css , но почему-то dash не распознает его.

Что меня смущает, так это то, что точно такой же код отлично работает в моей среде anaconda. Единственное отличие должно заключаться в том, что временный путь — это мой домашний каталог. Чего мне здесь не хватает?

Ответ №1:

У меня была такая же проблема, и после экспериментов с материалом я, наконец, нашел решение, если оно вам все еще нужно!!!

Это очень просто… все, что вам нужно сделать, это ввести:

 app = dash.Dash(__name__, assets_folder=resource_path('assets'))
  

таким образом, единственное отличие состоит в том, чтобы ввести ‘assets_folder’ вместо ‘assets_url_path’, и, похоже, это работает для —onefile!

Комментарии:

1. Спасибо! С тех пор я полностью подключился к своему приложению, но я уверен, что в какой-то момент оно появится снова.

2. Документация не описывает это так подробно, как я хотел. Ваш ответ помог, и просмотр источника помог. github.com/plotly/dash/blob/dev/dash/dash.py#L111

3. мне также помогло добавление —add-data ‘assets:assets’