Получение py2exe для работы с zope.interface
У меня есть приложение Python, основанное на Twisted и PyGTK. Сам Twisted зависит от zope.interface, и я не импортирую его напрямую.
К сожалению, когда я пытаюсь запустить свое приложение, в журнале ошибок появляется следующая ошибка:
Traceback (most recent call last):
File "tasks.py", line 4, in <module>
File "ui\__init__.pyc", line 14, in <module>
File "twisted\python\log.pyc", line 17, in <module>
ImportError: No module named zope.interface
Traceback (most recent call last):
File "tasks.py", line 4, in <module>
File "ui\__init__.pyc", line 14, in <module>
File "twisted\python\log.pyc", line 17, in <module>
ImportError: No module named zope.interface
Traceback (most recent call last):
File "tasks.py", line 4, in <module>
File "ui\__init__.pyc", line 14, in <module>
File "twisted\python\log.pyc", line 17, in <module>
ImportError: No module named zope.interface
Я пытался добавить каждую комбинацию zope.interface
а также zope
в INCLUDES
а также PACKAGES
, но это только дает мне эту ошибку времени сборки:
running py2exe
*** searching for required modules ***
C:\Python26\lib\site-packages\py2exe\build_exe.py:16: DeprecationWarning: the sets module is deprecated
import sets
Traceback (most recent call last):
File "setup.py", line 75, in <module>
'gtk/*.ui'
File "C:\Python26\lib\distutils\core.py", line 152, in setup
dist.run_commands()
File "C:\Python26\lib\distutils\dist.py", line 975, in run_commands
self.run_command(cmd)
File "C:\Python26\lib\distutils\dist.py", line 995, in run_command
cmd_obj.run()
File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 243, in run
self._run()
File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 296, in _run
self.find_needed_modules(mf, required_files, required_modules)
File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 1306, in find_needed_modules
mf.import_hook(f)
File "C:\Python26\lib\site-packages\py2exe\mf.py", line 719, in import_hook
return Base.import_hook(self,name,caller,fromlist,level)
File "C:\Python26\lib\site-packages\py2exe\mf.py", line 136, in import_hook
q, tail = self.find_head_package(parent, name)
File "C:\Python26\lib\site-packages\py2exe\mf.py", line 204, in find_head_package
raise ImportError, "No module named " + qname
ImportError: No module named zope
мой setup.py
является:
from distutils.core import setup
import py2exe
def find_data_files(source,target,patterns):
# I've elided this, I doubt it's relevant to the problem
# ...
INCLUDES = [
'cairo',
'pango',
'pangocairo',
'atk',
'gobject',
'gio',
]
PACKAGES = [
'encodings',
]
setup(
name = 'MyApp',
description = 'My Application',
version = '1.0',
windows = [
{
'script': os.path.join('ui','tasks.py'),
'icon_resources': [
(1, os.path.join(
'ui','data','iconpack.ico'))
],
}
],
options = {
'py2exe': {
'packages': ','.join(PACKAGES),
'includes': ','.join(INCLUDES),
}
},
data_files = find_data_files(
'ui', 'ui', [
'data/*',
'gtk/*.ui'
])
)
Как мне получить py2exe, чтобы построить это?
3 ответа
У меня была такая же проблема с zope.interface
и друзья (zope.component и др.). Конкретно это проблема с тем, как py2exe
поиск и обнаружение пакетов и как zope
пакеты установлены.
zope
является пакетом пространства имен и в результате опирается на некоторую прикольную логику импорта в .pth
файлы (см. zope.interface-3.*.*-py2.*-nspkg.pth
) для добавления его подпакетов в путь Python. Посмотрите на это в site-packages
и вы поймете, что я имею в виду.
py2exe
есть проблемы с "обнаружением" такого рода упаковки.
В итоге я вручную переупаковал различные zope
пакеты, которые я использовал в стандартной установке модуля в site-packages
а затем снова py2exe
- который тогда открыл все без проблем. Это ПИТА, но пока py2exe
может обрабатывать край упаковки и / или zope
пакеты упакованы в py2exe
дружелюбная мода, это лучшее, что вы можете сделать.
Я не знаю, решали ли вы это когда-нибудь, или это вообще имеет к вам отношение, но для будущих исследователей я нашел здесь простой способ решения проблемы импорта из zope.
В частности, добавить пустой __init__.py
подать в PYTHONDIR/Lib/site-packages/zope
каталог.
Я проверил это с twisted
приложение, используя этот установочный файл:
#!/usr/bin/env python
'''
File: setup.py
Author: Spencer Rathbun
Date: 07/24/2012
Description: Setup file for py2exe, converts client python script into executable.
'''
from distutils.core import setup
import py2exe
INCLUDES = [
''
]
PACKAGES = [
'twisted'
]
setup(
name = 'client',
description = '',
version = '1.0',
console = [
{"script":"client.py",
"icon_resources":[
(1, "c:\python27\DLLs\py.ico")
]
}
],
zipfile = None,
options = {"py2exe":
{"compressed": 1,
"optimize": 1,
"ascii": 0,
"bundle_files": 1,
"packages": ','.join(PACKAGES),
"includes": ','.join(INCLUDES),
}
}
)
Py2exe может использовать это для успешного создания исполняемого файла для Twisted, поскольку это зависит от zope.
Я столкнулся с этой проблемой при создании пакета с использованием py2exe в Windows XP SP3. Я понял, что py2exe неправильно определяет зависимости.
Чтобы решить эту проблему, я удалил сторонние пакеты и установил их, используя следующую команду easy_install
easy_install -Z <your_package_name>
Опция -Z распаковывает детали пакета, и, следовательно, содержимое не сжимается. Когда вы запустите py2exe сейчас, он правильно обнаружит зависимости.
Надеюсь это поможет!