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)
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_data
COLLECT
(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')
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.