CX freeze-включая мои собственные модули?

у меня есть небольшое приложение, построенное с PyQt4, которое я пытаюсь заморозить с помощью cx_freeze, но у меня возникает проблема с cx_freeze, включая некоторые из моих собственных модулей, которые необходимы для работы приложения.

у меня есть два модуля, которые импортируются в Мои приложения, расположенные в папке, где находится приложение. Т. е.:

приложения путь:

PythonDataViewer-PyQt4DataViewer.py

другой модули:

PythonМои Пакеты АнализаEphystools

PythonМои Пакеты АнализаPrairieAnalysis

в моем приложении я импортирую их с помощью (если они еще не в моем пути python)

sys.path.append(os.path.abspath('../My Analysis Packages'))

я попытался включить PrairieAnalysis и EphysTools в оба "включает" и "пакеты" в моем setup.py файл. Я также попытался включить "мои пакеты анализа". Я также попытался предоставить пути к ним.

они все содержат init.py-файлы, поскольку фактическое приложение способно импортировать их просто отлично.

если я помещу PrairieAnalysis и / или EphysTools в список "включает", то setup.py build возвращает ImportError:

 File "C:Anaconda3libsite-packagescx_Freezefinder.py", line 386, in _ImportModule
    raise ImportError("No module named %r" % name)
ImportError: No module named 'PrairieAnalysis'

если я оставлю их из "включает" setup.py сборка завершена, но затем, когда я иду, чтобы открыть приложение, я получаю ту же ошибку.

Я просмотрел различные модули импорта cx_Freeze вопросы, но ни один из них, похоже, не касался этого конкретного сценария.

мой фактический setup.py:

# -*- coding: utf-8 -*-

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

options = {
    'build_exe': {
        'includes': ['atexit', 'PrairieAnalysis', 'EphysTools'],
    }
}

executables = [
    Executable('DataViewer.py', base=base)
]

setup(name='DataViewer',
      version='0.1',
      description='Application for viewing Prairie-generated csv data files',
      options=options,
      executables=executables
      )

изменить 1: Вывод из ОС.getcwd () в setup.py файл:

D:OneDriveDocumentsPythonDataViewer-PyQt4

вывод из sys.путь в setup.py файл:

    ['D:OneDriveDocumentsPythonDataViewer-PyQt4', 'D:OneDriveDocumentsPythonMy Analysis Packages', 'C:Anac
    onda3python34.zip', 'C:Anaconda3DLLs', 'C:Anaconda3lib', 'C:Anaconda3', 'C:Anaconda3libsite-packages',
     'C:Anaconda3libsite-packagesSphinx-1.2.3-py3.4.egg', 'C:Anaconda3libsite-packageswin32', 'C:Anaconda3
    libsite-packageswin32lib', 'C:Anaconda3libsite-packagesPythonwin', 'C:Anaconda3libsite-packagesr
    unipy-0.1.1-py3.4.egg', 'C:Anaconda3libsite-packagessetuptools-7.0-py3.4.egg']

Edit 2:

поэтому я также попытался использовать py2exe, и я столкнулся с той же проблемой. Если я включаю пакеты в "includes", я получаю следующую обратную трассировку:

Traceback (most recent call last):
  File "setup.py", line 7, in <module>
    setup(windows=['DataViewer.py'], options={"py2exe": {"includes" :["sip", "PyQt4.QtCore", "PyQt4.QtGui", "PrairieAnal
ysis", "EphysTools"]}})
  File "C:Anaconda3libdistutilscore.py", line 148, in setup
    dist.run_commands()
  File "C:Anaconda3libdistutilsdist.py", line 955, in run_commands
    self.run_command(cmd)
  File "C:Anaconda3libdistutilsdist.py", line 974, in run_command
    cmd_obj.run()
  File "C:Anaconda3libsite-packagespy2exedistutils_buildexe.py", line 188, in run
    self._run()
  File "C:Anaconda3libsite-packagespy2exedistutils_buildexe.py", line 267, in _run
    builder.analyze()
  File "C:Anaconda3libsite-packagespy2exeruntime.py", line 164, in analyze
    mf.import_hook(modname)
  File "C:Anaconda3libsite-packagespy2exemf3.py", line 120, in import_hook
    module = self._gcd_import(name)
  File "C:Anaconda3libsite-packagespy2exemf3.py", line 274, in _gcd_import
    return self._find_and_load(name)
  File "C:Anaconda3libsite-packagespy2exemf3.py", line 318, in _find_and_load
    loader = importlib.find_loader(name, path)
  File "C:Anaconda3libimportlib__init__.py", line 87, in find_loader
    name=name)
ImportError: namespace packages do not have loaders

в этом случае я положил два пакета (PrairieAnalysis и EphysTools) в папку "Мой сайт-пакеты". Почему мои пакеты обрабатываются иначе, чем другие пакеты?

редактировать 3: Поэтому я получил py2exe для работы, используя следующий сценарий установки:

from distutils.core import setup
import py2exe
import PrairieAnalysis.pv_import
import EphysTools.utilities

includes = ["sip", "PyQt4.QtCore", "PyQt4.QtGui", "PrairieAnalysis", "EphysTools", "lxml._elementpath"]
packages = ["PrairieAnalysis", "EphysTools"]

setup(windows=['DataViewer.py'], options={"py2exe": {"includes" : includes,
                                                     "packages": packages}})

просто импорт PrairieAnalysis и Эфистул только не работал, хотя, ни делать

from PrairieAnalysis import *
from EphysTools import *

добавление этих операторов импорта в мой cx_freeze setup.py сценарий, однако, не устраняет проблему.

Edit 4:

>>> import PrairieAnalysis
>>> print(PrairieAnalysis.__file__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
>>> print(PrairieAnalysis.__init__)
<method-wrapper '__init__' of module object at 0x0000000002B9C9F8>

Edit 5:

>>> os.listdir('D:OneDriveDocumentsPythonMy Analysis Packages')
['.idea', 'EphysTools', 'PrairieAnalysis', '__init___.py']
>>> os.listdir('D:OneDriveDocumentsPythonMy Analysis PackagesPrairieAnalysis')
['misc_code.py', 'pv_import.py', 'pxml_parse.py', '__init___.py', '__pycache__']
>>> os.listdir('D:OneDriveDocumentsPythonMy Analysis PackagesEphysTools')
['synaptics.py', 'utilities.py', '__init___.py', '__pycache__']

1 ответов


вам нужно изменить sys.path в вашем setup.py сценарий таким же образом, как и в приложении. cx_Freeze смотрит на sys.путь для поиска модулей и пакетов для включения в сборку, поэтому, если каталог, содержащий эти пакеты, не находится в sys.путь, он не может их найти.

Edit: оказалось, что проблема была неправильно названа . Пакет был еще непереносимого как PEP 420 пакет пространства имен, но cx_Freeze еще не обрабатывает их.