Ошибка импорта APScheduler при генерации исполняемого файла с py2exe или cx_freeze

При генерации исполняемого файла на python 2.7 с использованием py2exe (0.6.9) или cx_freeze (5.0.1) с APScheduler (3.3.1) это дает мне следующую ошибку:

File "apscheduler\__init__.pyc", line 2, in <module> File "pkg_resources\__init__.pyc", line 552, in get_distribution File "pkg_resources\__init__.pyc", line 426, in get_provider File "pkg_resources\__init__.pyc", line 968, in require File "pkg_resources\__init__.pyc", line 854, in resolve pkg_resources.DistributionNotFound: The 'APScheduler' distribution was not found and is required by the application 

Это мой файл setup.py cx_freeze :

 import sys from cx_Freeze import setup, Executable # Dependencies are automatically detected, but it might need fine tuning. build_exe_options = {"includes": ["requests", "apscheduler"], "include_files": ["XXX"]} # GUI applications require a different base on Windows (the default is for a # console application). base = None if sys.platform == "win32": base = "Win32GUI" setup( name = "XXX", version = "XXX", description = "XXX", options = {"build_exe": build_exe_options}, executables = [Executable("XXX.py", base=base), Executable("XXX2.py", base=base)]) 

И это мой файл setup.py py2exe :

 from distutils.core import setup import py2exe data_files = ['XXX'] setup( data_files=data_files, windows=[ {'script': 'XXX.py'}, {'script': 'XXX2.py'}, ], options={'py2exe':{ 'includes': ['requests', 'apscheduler'], 'bundle_files': 1, } }, ) 

Я уже пытался использовать опцию «пакеты», но без успеха.

Если я удалю код из APScheduler __init__.py (apscheduler / __ init__.py), он будет работать.

Ниже представлен пакет __init__.py из пакета APScheduler:

 # These will be removed in APScheduler 4.0. release = __import__('pkg_resources').get_distribution('apscheduler').version.split('-')[0] version_info = tuple(int(x) if x.isdigit() else x for x in release.split('.')) version = __version__ = '.'.join(str(x) for x in version_info[:3]) 

Нужно ли каким-либо образом включать зависимости в пакет библиотек py2exe / cx_freeze?

Я уже проводил некоторые исследования в Интернете, но без успеха.

One Solution collect form web for “Ошибка импорта APScheduler при генерации исполняемого файла с py2exe или cx_freeze”

Нашел решение. Проблема заключалась в том, что файл py2exe не включал каталог dist-info в library.zip. Каждый модуль имеет свой собственный каталог dist-info в библиотеках python-пакетов сайта.

Эти каталоги используются библиотеками pkg_resources для импорта модулей, как мы можем видеть на apstcheduler __init__.py:

Все, что вам нужно сделать, это добавить эти каталоги dist-info в файл library.zip, сгенерированный py2exe.

Ниже приведен пример из google, импортирующего (non-related, но можно использовать в качестве примера) zoneinfo каталог library.zip.

https://github.com/google/transitfeed/blob/master/setup.py#L96

Чтобы получить путь dist-info модуля, используйте следующую команду:

 import os import pkg_resources dist_info_dir = pkg_resources.get_distribution('desired_module')._provider.egg_info # get base name of directory base_name = os.path.basename(dist_info_dir) 

Примечание. Если вместо этого нет каталога dist-info и информации о яйце. Вы, вероятно, должны искать пакет колес для библиотеки или создавать себя с помощью:

 python setup.py bdist_wheel 

Ура!

  • Обработка динамического импорта с помощью py2exe
  • Как я могу создать py2exe без ошибок?
  • Окно Python py2exe, показывающее (tkinter)
  • cx_freeze, как включить сторонние модули, ImportError: нет модуля с именем progressbar
  • Невозможно сделать автономный паук для бинарных скрипов с помощью cx_Freeze
  • python setup.py py2exe Недопустимый синтаксис (asyncsupport.py, строка 22)
  • dll загружает ошибки в исполняемом файле python из pywin32
  • Ошибки с Matplotlib при создании исполняемого файла с Py2exe (Python)
  • Python - лучший язык программирования в мире.