Проблемы с импортом Pyinstaller с Jinja2

#python #jinja2 #pyinstaller

#python #jinja2 #pyinstaller

Вопрос:

Есть пара сообщений о том, что Pyinstaller выдает распознавание jinja2, к сожалению, ни один из них не решил мою проблему. В идеале, если Pyinstaller поддерживает пакет, который, по его словам, поддерживает jinja2, его хук должен извлекать пакет и его файлы.

При запуске встроенной программы я получаю следующую ошибку:
Ошибка импорта: отсутствует необязательная зависимость ‘Jinja2’. Для DataFrame.style требуется jinja2. Используйте pip или conda для установки Jinja2.



введите описание изображения здесь

Из журнала сборки:
30562 ИНФОРМАЦИЯ: обработка перехватов модуля … 30563 ИНФОРМАЦИЯ: загрузка перехвата модуля ‘hook-jinja2.py » от «d:mainapplicationfoldervenvlibsite-packages_pyinstaller_hooks_contribhooksstdhooks «…

Я пробовал следующее под Windows 10, Python 3.8.5 с pyinstaller — 4.1, jinja2 — 2.11.2:

1. —путь «venv Lib site-packages» (путь к моим пакетам python, Pyinstaller создает несколько пакетов, но игнорирует jinja2)

2. —hidden-import=»jinja2″ (без эффекта)

3. —путь «D:mainapplicationfoldervenvlibsite-packagesjinja2lexer.py » (Чтобы проверить, будет ли он создавать один-единственный файл, не повезло)

4. вручную создал файл спецификации и добавил скрипт gmas80s для добавления точного пути к каждому файлу (без эффекта)

Мое дерево каталогов программ выглядит следующим образом:


mainapplicationfoldermakespec.py
main.py
функции (папка)
изображения (папка)
venv (папка)
Библиотека
site-packages
—- jinja2
32_32_gQU_icon.ico

Пример моей папки спецификаций:

 
# -*- mode: python -*-

# <<< START ADDED PART    
from PyInstaller.building.build_main import Analysis, PYZ, EXE, COLLECT, BUNDLE, TOC


def collect_pkg_data(package, include_py_files=False, subdir=None):
    import os
    from PyInstaller.utils.hooks import get_package_paths, remove_prefix, PY_IGNORE_EXTENSIONS

    # Accept only strings as packages.
    if type(package) is not str:
        raise ValueError

    pkg_base, pkg_dir = get_package_paths(package)
    if subdir:
        pkg_dir = os.path.join(pkg_dir, subdir)
    # Walk through all file in the given package, looking for data files.
    data_toc = TOC()
    for dir_path, dir_names, files in os.walk(pkg_dir):
        for f in files:
            extension = os.path.splitext(f)[1]
            if include_py_files or (extension not in PY_IGNORE_EXTENSIONS):
                source_file = os.path.join(dir_path, f)
                dest_folder = remove_prefix(dir_path, os.path.dirname(pkg_base)   os.sep)
                dest_file = os.path.join(dest_folder, f)
                data_toc.append((dest_file, source_file, 'DATA'))

    return data_toc

pkg_data = collect_pkg_data('jinja2')  # <<< Put the name of your package here
# <<< END ADDED PART    

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['makespec.py'],
             pathex=['venv\Lib\site-packages', 'venv\Lib\site-packages\jinga2', 'D:\mainapplicationfolder'],
             binaries=[],
             datas=[('functions\*', 'functions'), ('images\*', 'images')],
             hiddenimports=['jinja2'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='myprogram',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True , icon='32_32_gQU_icon.ico')
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               pkg_data,  # <<< Add here the collected files
               strip=False,
               upx=True,
               upx_exclude=[],
               name='makespec')
 

Программа создает и, похоже, извлекает все другие пакеты, кроме Jinja2, даже после того, как указаны все файлы. Похоже, многие другие успешно справились с этой проблемой. Я не уверен, где я ошибся.

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

1. Пожалуйста, отредактируйте в своем вопросе полное сообщение об ошибке, которое вы получаете при запуске своей программы.

2. Обновлено с информацией об ошибке

3. Дополнительное обновление с скриншотом консоли ошибок при выполнении встроенной программы

Ответ №1:

Я столкнулся с той же проблемой и обнаружил, что это не пакет jinja2, а его зависимость от markupsafe. Пакет markupsafe был обновлен, и он сломал ‘soft_unicode’. Вы можете увидеть поток github здесь: https://github.com/pallets/markupsafe/issues/284

Попробуйте эту версию в вашем requirements.txt или пип.

 pip install markupsafe==2.0.1
 

Желаю удачи.