2014-12-16 7 views
6

У меня есть небольшое приложение, построенное с 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__'] 

ответ

3

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

Редактировать: Оказалось, что проблема связана с недопустимым файлом __init__.py. Пакет все еще был импортирован как пакет пространства имен PEP 420, но cx_Freeze пока не обрабатывает их.

+0

Это была моя первая мысль, но это не решило проблему. – user3014097

+0

И фактически, строка sys.path на самом деле находится в блоке try..except, поскольку на компьютере, который я выполняю большую часть моего кодирования, на самом деле у меня есть «Мои пакеты анализа», включенные по умолчанию для моего пути python, поскольку я использую модулей так часто. Линия sys.path.append включена в приложение только в том случае, если я работаю на одном из моих компьютеров, где я не сделал этого изменения, чтобы гарантировать, что эти модули всегда доступны для импорта. – user3014097

+0

Можете ли вы получить свою настройку. py для печати 'os.getcwd()' и 'sys.path' перед вызовом setup() и проверить, что он ищет, где вы думаете, что он ищет эти пакеты? –

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