2016-03-05 20 views
8

Ich verwende pyinstaller, um meine Kolbenanwendung zu erstellen, alles funktioniert gut, außer ich bekomme Probleme mit Jinja2 Vorlagen.Pyinstaller Jinja2 TemplateNotFound

Es gab mir jinja2.exceptions.TemplateNotFound,

Ich versuchte from app import template zu setzen, die die Vorlagen-Ordner ist, aber es hat nicht funktioniert (ich denke, da sie keine py Datei nicht enthalten).

Ich habe auch versucht die .spec Datei Ändern der templates Ordner

added_files = [ 
     ('..\\CommerceApp\\app\\templates', 'templates'), 
     ('..\\CommerceApp\\app\\static', 'static') 
     ] 

a = Analysis(['..\\CommerceApp\\run.py'], 
      pathex=['D:\\PythonProjects\\CommerceAppExe'], 
      binaries=None, 
      datas=added_files, 
      hiddenimports=[], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 

aufzunehmen Aber es hat nicht funktioniert, das gleiche Resultat, als ob ich den Ordner manuell von mir kopieren.

Gibt es eine Möglichkeit, die Vorlage zusammen mit der .exe zu integrieren?


bearbeiten

Das ist mein spec Datei

# -*- mode: python -*- 

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, 
       strip=False, 
       upx=True, 
       name='SupplyTracker') 

Edit 2

akzeptierte Antwort auf gmas80 geändert werden weil es das Problem behebt.

bearbeiten 3

auch nur merke ich, ich kann einfach einen neuen Ordner mit meinem Paketnamen machen und in dem statischen Templates css, html, etc. füllen, und es ist gonna Arbeit (ähnliches Ergebnis von dem, was gmas80 script does)

+0

erstellen 1-Ordner eingefrorene Anwendung und prüfen, ob alle Vorlagendateien gesammelt wurden! – gmas80

Antwort

5

Ich glaube nicht, dass das Problem ist, was in https://stackoverflow.com/a/35816876/2741329 beschrieben wird. Ich konnte gerade eine Anwendung mit Jinja2 einfrieren.

In meiner Spec-Datei verwende ich diesen Ansatz alle Vorlagen zu sammeln:

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>') 

Dann pkg_data zum COLLECT (1-Ordnern) hinzuzufügen oder zu der EXE (1-Datei) .spec.

In der 1-Ordner-Lösung sollten Sie alle Ihre Vorlagen in dem erstellten Unterordner finden können.


bearbeiten

Dies könnte funktionieren (vorausgesetzt, dass Sie ein Paket (dh, Sie haben eine __init__.py folgenden Vorschläge): 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') 
+0

Hey, entschuldige, wenn ich nicht weiß, wie du das 'pkg_data' Attribut in' COLLECT' in 'spec 'Datei? Ich habe versucht, den Pfadnamen des Skripts (../path/to/pkg_data.py) zu setzen, aber es hat nicht funktioniert. Soll ich das Skript in mein Hauptscript "importieren"? oder irgendwo in 'Analyse'-Attribute einfügen? Danke – andiwin

+0

@ kingathur61: Warum legst du deine ganze Spec-Datei nicht in den Fragenkörper? Damit ich es bearbeiten kann, glaube ich, dass das funktionieren kann. – gmas80

+0

Ich habe die Spezifikationsdatei in meiner Bearbeitung – andiwin

2

Das Jinja2-Paket verwendet die pkg_resources-API, die von PyInstaller nicht unterstützt wird. Das Modul pkg_resources wird über das setuptools-Paket bereitgestellt.

Von der FAQ Seite von pyinstaller:

pkg_resources derzeit nicht von PyInstaller unterstützt. Das bedeutet , dass eine Anwendung, die eine Bibliothek verwendet, die die pkg_resources-API verwendet, wahrscheinlich nicht out of the box funktioniert. Die einzige Situation, in der funktioniert, ist, wenn es für .egg-Dateien verwendet wird (siehe oben). Für Details folgen Ausgabe # 183.

+0

Ah, ich sehe, also bis pyinstaller aktualisiert wird, gibt es nichts, was ich tun kann, oder? – andiwin

+0

@Forge und @ kingathur61: '' jinja2.exceptions.TemplateNotFound'' ist nicht verwandt mit '' pkg_resources''. Sonst wäre es etwas anderes gewesen: https://github.com/pyinstaller/pyinstaller/issues/1898 – gmas80