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 еще не обрабатывает их.