Получение 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

My setup.py is:

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 построить это?


person detly    schedule 19.10.2011    source источник


Ответы (3)


У меня была такая же проблема с zope.interface и друзьями (zope.component и др.). В частности, это проблема с тем, как py2exe ищет и обнаруживает пакеты, И как устанавливаются пакеты zope.

zope - это пакет пространства имен, и в результате он полагается на некоторую причудливую логику импорта в своих .pth файлах (см. zope.interface-3.*.*-py2.*-nspkg.pth), чтобы добавить свои подпакеты в путь python. Взгляните на это в site-packages, и вы поймете, что я имею в виду.

py2exe не может "обнаружить" такой пакет.

В конце концов, я вручную переупаковал различные пакеты zope, которые я использовал, в настройку модуля stardard в site-packages, а затем повторно запустил py2exe, который затем обнаружил все без проблем. Это PITA, но пока py2exe не сможет справиться с крайними случаями упаковки и/или zope пакеты не будут упакованы py2exe дружественным образом, это лучшее, что вы можете сделать.

person Mark Gemmill    schedule 19.10.2011
comment
Я пошел проверить, могу ли я это сделать, не нарушая их лицензии. Мне кажется, или публичная лицензия Zope на самом деле не включена ни в один из их дистрибутивов? - person detly; 19.10.2011
comment
В верхней части файлов кода есть ссылка на включение лицензии — это все, что им нужно. Вы не делаете ничего, что противоречит лицензии (т. е. вы фактически никаким образом не меняете код), вы просто меняете способ установки пакета в вашей системе. Это ничем не отличается от того, что py2exe уже делает со всеми вашими библиотеками Python, которые он упаковывает в exe. - person Mark Gemmill; 19.10.2011
comment
у меня сложилось впечатление, что он все равно будет создавать производную работу, но похоже, что лицензия в любом случае довольно либеральна, так что неважно. - person detly; 19.10.2011
comment
Хорошо, я отмечаю это как ответ, так как я прошел этот этап, но теперь py2exe задыхается почти от всех остальных пакетов, которые я использую, поэтому я отказываюсь от него. Так что для всех, кто читает это, у меня нет возможности проверить, работало ли это в окончательном исполняемом файле:/ - person detly; 20.10.2011
comment
ах, да, py2exe иногда требует некоторой работы, чтобы собрать все различные пакеты в связку. Обычно py2exe довольно хорошо сообщает вам, с какими библиотеками у него проблемы, но некоторые (например, zope) требуют некоторого расследования. На веб-сайте py2exe есть несколько советов и т. д., но они немного дезорганизованы и требуют некоторого изучения. Я упаковал приложение с помощью wxPython, zope и некоторых других, и мне потребовалось несколько мучительных дней, чтобы разобраться с проблемой. Как только это было сделано, все работало хорошо. Добраться туда просто PITA. - person Mark Gemmill; 20.10.2011
comment
Да, может быть, мне просто нужно придерживаться этого. Я чувствую, что ни с какой другой системой не будет проще. - person detly; 20.10.2011
comment
Можно избежать переупаковки, используя очень простой ответ Спенсера ниже. - person Adam Nemitoff; 05.02.2014

Я не знаю, решали ли вы когда-нибудь эту проблему, и актуальна ли она вообще для вас, но для будущих искателей я нашел простой способ решить проблему с импортом 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 Now, так как это зависит от zope.

person Spencer Rathbun    schedule 24.07.2012
comment
Это сработало для меня, должен быть принятый ответ imo - person Willem D'Haeseleer; 24.04.2014
comment
Да, это, безусловно, лучший ответ. Спасибо за это - person Bjorn Stiel; 10.05.2015
comment
Да, у меня работало с модулем repoze (repoze.lru), необходимым для модуля маршрутов. - person digitalacorn; 19.08.2015

Я столкнулся с этой проблемой при создании пакета с использованием py2exe в Windows XP SP3. Я понял, что py2exe неправильно определяет зависимости.

Чтобы решить эту проблему, я удалил свои сторонние пакеты и установил их с помощью следующей команды easy_install.

easy_install -Z <your_package_name>

Параметр -Z распаковывает сведения о пакете, поэтому содержимое не сжимается. Когда вы сейчас запустите py2exe, он правильно обнаружит зависимости.

Надеюсь это поможет!

person URB    schedule 03.12.2013