2015-06-19 6 views
3

Я пытаюсь построить Windows, исполняемым с py2exe для программы на Python, который использует пакет jsonschema, но каждый раз, когда я пытаюсь запустить исполняемый файл он терпит неудачу со следующей ошибкой:py2exe не узнавая jsonschema

File "jsonschema\__init__.pyc", line 18, in <module> 
File "jsonschema\validators.pyc", line 163, in <module> 
File "jsonschema\_utils.pyc", line 57, in load_schema 
File "pkgutil.pyc", line 591, in get_data 
IOError: [Errno 0] Error: 'jsonschema\\schemas\\draft3.json' 

Я попытался добавить json и jsonschema в параметры пакета для py2exe в файле setup.py, и я также попытался вручную скопировать каталог jsonschema из своего местоположения в Python27 \ Libs \ site-packages в library.zip, но ни одна из них не работает , Я также попытался использовать найденное здесь решение (http://crazedmonkey.com/blog/python/pkg_resources-with-py2exe.html), которое предполагает расширение py2exe, чтобы иметь возможность копировать файлы в zip-файл, но это тоже не сработало.

Я предполагаю, что это происходит потому, что py2exe включает только файлы Python в library.zip, но мне было интересно, есть ли способ для этого работать без необходимости конвертировать draft3.json и draft4.json в .py-файлы в их первоначальном месте.

Спасибо заранее

ответ

2

Ну после того, как некоторые более прибегая к помощи (я ненавижу уродливую) Я получил это работает без исправления файла build_exe.py. Ключом к этому было рецепт: http://crazedmonkey.com/blog/python/pkg_resources-with-py2exe.html. Мой класс коллектор выглядит следующим образом:

from py2exe.build_exe import py2exe as build_exe 

class JsonSchemaCollector(build_exe): 
    """ 
     This class Adds jsonschema files draft3.json and draft4.json to 
     the list of compiled files so it will be included in the zipfile. 
    """ 

    def copy_extensions(self, extensions): 
     build_exe.copy_extensions(self, extensions) 

     # Define the data path where the files reside. 
     data_path = os.path.join(jsonschema.__path__[0], 'schemas') 

     # Create the subdir where the json files are collected. 
     media = os.path.join('jsonschema', 'schemas') 
     full = os.path.join(self.collect_dir, media) 
     self.mkpath(full) 

     # Copy the json files to the collection dir. Also add the copied file 
     # to the list of compiled files so it will be included in the zipfile. 
     for name in os.listdir(data_path): 
      file_name = os.path.join(data_path, name) 
      self.copy_file(file_name, os.path.join(full, name)) 
      self.compiled_files.append(os.path.join(media, name)) 

То, что осталось, чтобы добавить его в настройках ядра, как это:

options = {"bundle_files": 1, # Bundle ALL files inside the EXE 
      "compressed": 2,  # compress the library archive 
      "optimize": 2,  # like python -OO 
      "packages": packages, # Packages needed by lxml. 
      "excludes": excludes, # COM stuff we don't want 
      "dll_excludes": skip} # Exclude unused DLLs 

distutils.core.setup(
    cmdclass={"py2exe": JsonSchemaCollector}, 
    options={"py2exe": options}, 
    zipfile=None, 
    console=[prog]) 

Часть кода опущена, так как это не имеет значения в этом контексте, но я думаю, вы получаете дрейф.

Смежные вопросы