2016-03-05 17 views
8

pyinstaller kullanıyorum, flask uygulamasını kurmak için herşey iyi çalışıyor, ancak Jinja2 şablonları ile problem yaşamadım. Pyinstaller Jinja2 TemplateNotFound

Ben şablonları klasör from app import template koymak için çalıştı, ama (onlar herhangi py dosyayı içermeyen beri sanırım) işe yaramadı bana jinja2.exceptions.TemplateNotFound,

verdi.

Ben de templates klasöre

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) 

içerecek şekilde .spec dosyasını değiştirerek denedim Ama başıma elle klasörünü kopyalayın sanki, ya aynı sonucu işe yaramadı.

Eklenti ile birlikte paketlenecek şablonu eklemenin bir yolu var mı?


Düzenleme

Bu benim spec dosya

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

Kabul Cevap gmas80 değiştirildi Düzenleme olabilirsiniz çünkü sorunu düzeltir.

Düzenleme 3

Ayrıca ben sadece ben sadece benim paket adıyla yeni bir klasör yapmak ve vb statik şablonlar css, html, doldurabilirsiniz, biliyoruz ve bu işin yürümeyeceğini (benzer sonuç ne gmas80 komut dosyası)

+0

1-klasör oluşturun donmuş uygulama ve tüm şablon dosyaları toplanmış olup olmadığını kontrol edin! – gmas80

cevap

5

Bu sorunun, https://stackoverflow.com/a/35816876/2741329'da açıklandığı gibi olduğuna inanmıyorum. Bir uygulamayı Jinja2 ile dondurabildim.Benim Spec dosyasında

Ben tüm şablonları toplamak için kullandığı yöntem:

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

Sonra COLLECT (1-klasörüne) veya EXE (1 dosya) spec için pkg_data ekleyin. 1-klasör çözümde

, oluşturduğunuz alt klasöründe tüm şablonları bulmak mümkün olmalıdır.


Düzenleme

Bu işe yarayabilecek (eğer (bir paket var olduğunu varsayarak yani, sahip Bu önerilerden aşağıdaki bir __init__.py): 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

Bilmiyorum Hey üzgünüm, nasıl spec 'in' pkg_data' COLLECT' 'içine öznitelik koyarım dosya? Senaryonun (../path/to/pkg_data.py) arasında 'pathname' koyarak denedim ama işe yaramadı. Komut dosyasını ana komutumda içe aktarmalı mıyım? veya 'Analiz' özelliklerinde bir yere koyun? Teşekkür kingathur61 @ – andiwin

+0

: Neden soru vücutta senin tüm spec dosyası koymuyorsun? Böylece çalışabileceğine inandığım şekilde düzenleyebilirim. – gmas80

+0

benim düzenlemek kingathur61 @ – andiwin

2
paketi, PyInstaller tarafından desteklenmeyen pkg_resources API'sini kullanır. pkg_resources modülü, setuptools paketi aracılığıyla sağlanır. pyinstaller ait FAQ sayfasından

:

pkg_resources şu anda PyInstaller tarafından desteklenmemektedir. Bu, anlamına gelir, pkg_resources API'sini kullanan bir kitaplığı kullanan bir uygulama muhtemelen kutudan çıkmayacaktır. 'un çalıştığı tek durum .egg dosyalarında kullanıldığında ortaya çıkar (yukarı bakın). ayrıntıları için # 183 numaralı meseleyi takip edin.

+0

Ah, anladım, piyoseler güncellemeye kadar, doğru yapabileceğim hiçbir şey yok mu? – andiwin

+0

@Forge ve @ kingathur61: '' jinja2.exceptions.TemplateNotFound'' pkg_resources'' '' ilişkili değildir. Aksi takdirde, farklı bir şey olurdu: https://github.com/pyinstaller/pyinstaller/issues/1898 – gmas80