Упаковка python bottle приложение в виде одного приложения - PullRequest
0 голосов
/ 04 марта 2020

Я разработал приложение python с использованием bottle (в Linux) и пытался упаковать его в один файл, используя следующее: -

pyinstaller --add-data 'static:static' --add-data 'views:views' myapplication.py --onefile --noconsole

Pyinstaller не показывался любые ошибки, но когда я запускаю приложение, я получил ошибку в веб-браузере, говорящую, что шаблон не найден.

Приложение прекрасно работает без упаковки.

Может кто-нибудь указать мне правильное направление? Спасибо.

=======================================

Дополнительная информация :

В моем bottle коде у меня есть следующее: -

@route('/' + TEMP_DIR + '/<filename:path>')
def send_static(filename):
    return static_file(filename, root='./' + TEMP_DIR)

@route('/css/<filename:path>')
def send_static(filename):
    return static_file(filename, root='./static/css')

@route('/js/<filename:path>')
def send_static(filename):
    return static_file(filename, root='./static/js')

@route('/img/<filename:path>')
def send_static(filename):
    return static_file(filename, root='./static/img')

@route('/')
def home():
    info = {'application_name': APPLICATION_NAME, 'version': VERSION}
    return template('main_page.tpl', info)

Пример кода в html: -

<head>
  <link rel="stylesheet" href="/css/styles.css">
</head>

Структура каталогов: -

myapp.py
   +
   +----static
   |      +-----css/<css files>
   |      +-----js/<js files>
   |      +-----img/<img files>
   |
   +----views
          +-----<tpl files>

Кстати, если я помещу stati c и просматриваю каталоги в папке, содержащей скомпилированный двоичный файл, приложение работает.

1 Ответ

0 голосов
/ 22 марта 2020

Я наконец-то начал работать, подробно изучив PyInstaller и Bottle. Вот как я это сделал: -

Я добавил следующее (только для примера) в приложение bottle, когда PyInstaller распаковывает файлы в каталог tmp. Код сообщает bottle, где найти распакованные файлы.

BUNDLE_TEMP_DIR = ''

try:

if getattr(sys, 'frozen') and hasattr(sys, '_MEIPASS'):
    BUNDLE_TEMP_DIR = sys._MEIPASS
    #Modify template
    bottle.TEMPLATE_PATH.insert(0,BUNDLE_TEMP_DIR + '/views')

except:

BUNDLE_TEMP_DIR= '' 

@route('/css/<filename:path>')
def send_static(filename):
    if (BUNDLE_TEMP_DIR != ''):
        return static_file(filename, root= BUNDLE_TEMP_DIR + '/static/css')
    else:
        return static_file(filename, root='./static/css')

Затем я запускаю PyInstaller, используя это (моя структура каталогов такая же, как указано выше):

python3 -m PyInstaller - -name busker-helper --add-data 'static / css / : статическое / css' --add-data 'static / js / : статическое / js' --add-data 'static / css / : static / css' --add-data 'views / : views' busker-helper.py --onefile --noconsole

Вышеприведенное работает под linux. В Windows заменить ":" (двоеточие) на ";" (точка с запятой).

Вам также может понадобиться включить параметр --hidden-import в PyInstaller.

Надеюсь, что кому-то это поможет.

...