2016-03-05 7 views
8

मैं अपने फ्लास्क एप्लिकेशन को बनाने के लिए pyinstaller का उपयोग कर रहा हूं, सब कुछ ठीक काम कर रहा है सिवाय इसके कि मुझे Jinja2 टेम्पलेट्स के साथ समस्याएं मिलती हैं।पायइंस्टॉलर Jinja2 TemplateNotFound

यह मेरे jinja2.exceptions.TemplateNotFound,

दिया मैं from app import template जो टेम्पलेट्स फ़ोल्डर है डालने की कोशिश की, लेकिन यह काम नहीं किया (मुझे लगता है कि जब से वे किसी भी py फ़ाइल शामिल नहीं है)।

मैं भी .spec फ़ाइल को बदलने templates फ़ोल्डर

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) 

शामिल करने की कोशिश की लेकिन यह या तो काम नहीं किया, एक ही परिणाम के रूप में अगर मैं अपने आप को करके स्वयं भी फ़ोल्डर की प्रतिलिपि।

क्या टेम्पलेट को .exe के साथ एक साथ बंडल करने का कोई तरीका है?


संपादित

यह मेरा spec फ़ाइल

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

संपादित 2

स्वीकृत उत्तर gmas80 करने के लिए बदल किया है क्योंकि यह समस्या को हल करता है।

संपादित 3

इसके अलावा मैं सिर्फ एहसास, मैं बस अपना पैकेज नाम के साथ एक नया फ़ोल्डर बनाने के लिए और स्थिर टेम्पलेट्स css, html, आदि में भर सकते हैं, और यह काम करने वाला (से समान परिणाम है क्या gmas80 स्क्रिप्ट करता है)

+0

एक 1-फ़ोल्डर बनाएँ जमे हुए आवेदन और जांचें कि क्या सभी टेम्पलेट फाइलें एकत्र की गई हैं! – gmas80

उत्तर

5

मुझे विश्वास नहीं है कि समस्या https://stackoverflow.com/a/35816876/2741329 में वर्णित है। मैं अभी Jinja2 के साथ एक आवेदन जमा करने में सक्षम हूं।

मेरी कल्पना फ़ाइल में मैं सभी टेम्पलेट इकट्ठा करने के लिए इस दृष्टिकोण का उपयोग:

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

फिर COLLECT (1-फ़ोल्डर) करने के लिए या EXE (1-फाइल) .spec को pkg_data जोड़ें।

1-फ़ोल्डर समाधान में, आपको बनाए गए उप-फ़ोल्डर में अपने सभी टेम्पलेट्स को ढूंढने में सक्षम होना चाहिए।


संपादित

यह काम हो सकता है (यह मानते हुए आप एक पैकेज है (यानी, आपके पास एक __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

अरे मुझे खेद है अगर मुझे नहीं पता, तो आप 'pkg_data' विशेषता' spec 'में 'COLLECT' में कैसे डालते हैं फाइल? मैंने स्क्रिप्ट के 'पथनाम' को डालने का प्रयास किया (../path/to/pkg_data.py) लेकिन यह काम नहीं किया। क्या मुझे अपनी मुख्य लिपि में स्क्रिप्ट आयात करना चाहिए? या इसे 'विश्लेषण' विशेषताओं में कहीं कहीं रखें? धन्यवाद – andiwin

+0

@ राजाथुर 61: आप प्रश्नपत्र में अपनी पूरी कल्पना फ़ाइल क्यों नहीं डालते? ताकि मैं इसे संपादित कर सकूं क्योंकि मेरा मानना ​​है कि काम कर सकता है। – gmas80

+0

मैंने अपने संपादन – andiwin

2

Jinja2 पैकेज pkg_resources API का उपयोग करता है जो PyInstaller द्वारा समर्थित नहीं है। pkg_resources मॉड्यूल setuptools पैकेज के माध्यम से प्रदान किया जाता है।

pyinstaller की FAQ पृष्ठ से:

pkg_resources वर्तमान में PyInstaller द्वारा समर्थित नहीं है। इसका अर्थ है कि एक पुस्तकालय का उपयोग करने वाला एक अनुप्रयोग जो pkg_resources API का उपयोग करता है, शायद बॉक्स से बाहर काम नहीं करेगा। एकमात्र स्थिति जिसमें यह काम करता है जब यह .egg फ़ाइलों पर उपयोग किया जा रहा है (ऊपर देखें)। विवरण के लिए समस्या # 183 का पालन करें।

+0

आह, मैं देखता हूं, तब तक जब तक कि पइंस्टॉलर अपडेट नहीं किया जाता है, तो कुछ भी नहीं है जो मैं सही कर सकता हूं? – andiwin

+0

@ फोर्ज और @ राजाथुर 61: 'jinja2.exceptions.TemplateNotFound'' 'pkg_resources'' से संबंधित नहीं है। अन्यथा, यह कुछ अलग होता: https://github.com/pyinstaller/pyinstaller/issues/1898 – gmas80