У меня есть небольшое приложение, построенное с PyQt4, которое я пытаюсь зависнуть cx_freeze, но у меня возникает проблема с cx_freeze, включая некоторые из моих собственных модулей, которые необходимы для работы приложения.cx_freeze - включая мои собственные модули?
У меня есть два модуля, которые импортированы в мое приложение, которые находятся в папке выше, где находится приложение. То есть:
путь Применение:
Python \ DataViewer-PyQt4 \ DataViewer.py
Другие модули:
Python \ My Analysis Packages \ Ephystools
Python \ My Analysis Packages \ PrairieAnalysis
В моем приложении я импортирую их, используя (если они уже не в моем пути python)
sys.path.append(os.path.abspath('../My Analysis Packages'))
Я попытался включить PrairieAnalysis и EphysTools в оба "включает" и "пакеты" в файл setup.py. Я попытался включить «Мои пакеты анализа». Я попытался предоставить пути к ним.
Все они содержат init .py файлы, так как фактическое приложение способно импортировать их в порядке.
Если я ставлю PrairieAnalysis и/или EphysTools в «включает в себя» список затем setup.py сборки возвращает ImportError:
File "C:\Anaconda3\lib\site-packages\cx_Freeze\finder.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
)
Edit 1: Выход из os.getcwd() в файле setup.py:
D:\OneDrive\Documents\Python\DataViewer-PyQt4
Выход из sys.path в setup.py файл:
['D:\\OneDrive\\Documents\\Python\\DataViewer-PyQt4', 'D:\\OneDrive\\Documents\\Python\\My Analysis Packages', 'C:\\Anac
onda3\\python34.zip', 'C:\\Anaconda3\\DLLs', 'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 'C:\\Anaconda3\\lib\\site-packages',
'C:\\Anaconda3\\lib\\site-packages\\Sphinx-1.2.3-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Anaconda3
\\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\lib\\site-packages\\r
unipy-0.1.1-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\setuptools-7.0-py3.4.egg']
Edit 2:
Итак, я также попытался использовать py2exe, и я столкнулся с той же проблемой. Если бы я включил пакеты в «включает в себя» я получаю следующее отслеживающий:
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:\Anaconda3\lib\distutils\core.py", line 148, in setup
dist.run_commands()
File "C:\Anaconda3\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
File "C:\Anaconda3\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Anaconda3\lib\site-packages\py2exe\distutils_buildexe.py", line 188, in run
self._run()
File "C:\Anaconda3\lib\site-packages\py2exe\distutils_buildexe.py", line 267, in _run
builder.analyze()
File "C:\Anaconda3\lib\site-packages\py2exe\runtime.py", line 164, in analyze
mf.import_hook(modname)
File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 120, in import_hook
module = self._gcd_import(name)
File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 274, in _gcd_import
return self._find_and_load(name)
File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 318, in _find_and_load
loader = importlib.find_loader(name, path)
File "C:\Anaconda3\lib\importlib\__init__.py", line 87, in find_loader
name=name)
ImportError: namespace packages do not have loaders
В этом случае я кладу два пакета (PrairieAnalysis и EphysTools) в моей папке сайт-пакеты. Почему мои пакеты обрабатываются иначе, чем другие пакеты?
Edit 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 и EphysTools само по себе не работать, хотя, и не делать
from PrairieAnalysis import *
from EphysTools import *
Добавление этих операторов импорта в мой скрипт cx_freeze setup.py, однако, не устраняет проблему.
Редактировать 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:\\OneDrive\\Documents\\Python\\My Analysis Packages')
['.idea', 'EphysTools', 'PrairieAnalysis', '__init___.py']
>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages\\PrairieAnalysis')
['misc_code.py', 'pv_import.py', 'pxml_parse.py', '__init___.py', '__pycache__']
>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages\\EphysTools')
['synaptics.py', 'utilities.py', '__init___.py', '__pycache__']
Это была моя первая мысль, но это не решило проблему. – user3014097
И фактически, строка sys.path на самом деле находится в блоке try..except, поскольку на компьютере, который я выполняю большую часть моего кодирования, на самом деле у меня есть «Мои пакеты анализа», включенные по умолчанию для моего пути python, поскольку я использую модулей так часто. Линия sys.path.append включена в приложение только в том случае, если я работаю на одном из моих компьютеров, где я не сделал этого изменения, чтобы гарантировать, что эти модули всегда доступны для импорта. – user3014097
Можете ли вы получить свою настройку. py для печати 'os.getcwd()' и 'sys.path' перед вызовом setup() и проверить, что он ищет, где вы думаете, что он ищет эти пакеты? –