Pyinstaller Jinja2 TemplateNotFound

j'utilise pyinstaller pour construire mon application flasque, tout fonctionne bien sauf que j'ai des problèmes avec les modèles Jinja2.

Il m'a donné jinja2.exceptions.TemplateNotFound,

j'ai essayé de mettre from app import template qui est le dossier templates, mais ça n'a pas marché (je suppose qu'ils ne contiennent pas de py fichier).

j'ai aussi essayé de changer le .spec le fichier templates dossier

added_files = [
         ( '..CommerceAppapptemplates', 'templates' ),
         ( '..CommerceAppappstatic', 'static' )
        ]

a = Analysis(['..CommerceApprun.py'],
             pathex=['D:PythonProjectsCommerceAppExe'],
             binaries=None,
             datas=added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

mais ça n'a pas marché non plus, même résultat que si je copie le dossier manuellement par moi-même.

Est-il possible d'inclure Modèle livré avec la .exe?


Modifier

C'est mon spec le fichier

# -*- mode: python -*-

block_cipher = None

a = Analysis(['..CommerceApp_withPyInstallerrun.py'],
             pathex=['D:PythonProjectsCommerceAppExe'],
             binaries=None,
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='SupplyTracker',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='SupplyTracker')

Edit 2

réponse acceptée changé à gmas80 parce qu'il corrige le problème.

Edit 3

aussi je me rends compte que je peux juste faire nouveau dossier avec mon nom de paquet et remplir les modèles statiques css,html, etc, et il va travailler (résultat similaire à partir de ce gmas80 script)

8
demandé sur Community 2016-03-05 10:37:03

2 réponses

je ne crois pas que la question est ce qui est décrit dans https://stackoverflow.com/a/35816876/2741329. J'ai juste été capable de geler une application avec Jinja2.

dans mon fichier spec j'utilise cette approche pour collecter tous les modèles:

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('<YOUR LIB HERE>')

puis Ajouter pkg_dataCOLLECT (1-dossier) ou à l' EXE (1 fichier) .specs.

dans la solution 1-folder, vous devriez être en mesure de trouver tous vos modèles dans le sous-dossier.


Modifier

cela pourrait fonctionner (en supposant que vous avez un paquet (i.e., vous avez un __init__.py), en suivant ces conseils: http://flask.pocoo.org/docs/0.10/patterns/packages/):

# -*- 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('<yourapplication>')  # <<< Put the name of your package here
# <<< END ADDED PART    

block_cipher = None

a = Analysis(['..\CommerceApp_withPyInstaller\run.py'],
             pathex=['D:\PythonProjects\CommerceAppExe'],
             binaries=None,
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='SupplyTracker',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               pkg_data,  # <<< Add here the collected files
               strip=False,
               upx=True,
               name='SupplyTracker')
5
répondu gmas80 2017-05-23 10:30:42

Jinja2 package pkg_resources API qui n'est pas supporté par PyInstaller. pkg_resources le module est fourni via le setuptools paquet.

FAQ page de pyinstaller:

pkg_resources n'est actuellement pas supporté par PyInstaller. Cela signifie qu'une application utilisant une bibliothèque qui utilise les ressources pkg_ressources L'API ne fonctionnera probablement pas. La seule situation dans laquelle il fonctionne, c'est lorsqu'il est utilisé sur .oeuf de fichiers (voir ci-dessus). Pour les détails suivent le numéro 183.

2
répondu Forge 2016-03-06 06:38:01