ImportError: не может импортировать имя MAXREPEAT с cx_Freeze

У меня возникла проблема с cx_Freeze при запуске замороженного приложения (отлично работает незамерзаемо).

При запуске программы это приводит к следующей трассировке:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/Console.py", line 27, in <module>
    exec code in m.__dict__
  File "PythonApp/mainframe.py", line 3, in <module>
  File "/usr/local/lib/python2.7/site-packages/dbus/__init__.py", line 103, in <module>
    from dbus._dbus import Bus, SystemBus, SessionBus, StarterBus
  File "/usr/local/lib/python2.7/site-packages/dbus/_dbus.py", line 39, in <module>
    from dbus.bus import BusConnection
  File "/usr/local/lib/python2.7/site-packages/dbus/bus.py", line 39, in <module>
    from dbus.connection import Connection
  File "/usr/local/lib/python2.7/site-packages/dbus/connection.py", line 27, in <module>
    import threading
  File "/usr/local/lib/python2.7/threading.py", line 44, in <module>
    module='threading', message='sys.exc_clear')
  File "/usr/local/lib/python2.7/warnings.py", line 57, in filterwarnings
    import re
  File "/usr/local/lib/python2.7/re.py", line 105, in <module>
    import sre_compile
  File "/usr/local/lib/python2.7/sre_compile.py", line 14, in <module>
    import sre_parse
  File "/usr/local/lib/python2.7/sre_parse.py", line 17, in <module>
    from sre_constants import *
  File "/usr/local/lib/python2.7/sre_constants.py", line 18, in <module>
    from _sre import MAXREPEAT
ImportError: cannot import name MAXREPEAT

Я работаю на Linux, используя версию python 2.7.4, которую я создал из источника, и импортирует _sre из приглашения, и я могу получить доступ к константе MAXREPEAT.

Обычно это до cx_Freeze не тянет все в library.zip и может быть исправлено путем явного указания модуля в списке cx_Freeze setup include и является решением для этого аналогичный вопрос, но это не помогло здесь.

Этот _sre модуль кажется странным.. нет файла _sre в library.zip, но из этой ошибки кажется, что он может его найти, однако он не может импортировать этот символ? Конечно, если модуль не был там, это было бы ошибкой "No module named _sre". Или, возможно, круговой импорт, но _sre заглушка не имеет импорта.

Какой странный я тоже не могу найти файл - этот динамический динамический модуль создается при импорте?

find /usr/local/lib/python2.7 -name "_sre*"

ничего не возвращает, а импортированный _sre модуль не имеет атрибута __file__, поэтому я не знаю, как убедиться, что он включен, поскольку он отображается как встроенный.

>>> import _sre
>>> _sre.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
>>> repr(_sre)
"<module '_sre' (built-in)>"

Это похожий на этот вопрос, который был задан недавно, но в этом случае он получал ошибку в обычном интерпретаторе, однако для меня это просто в cx_Freeze.

изменить

Запуск python -v действительно выглядит как встроенный, поэтому я не уверен, почему cx_Freeze может пропустить его или как я его исправит.

...
# /usr/local/lib/python2.7/re.pyc matches /usr/local/lib/python2.7/re.py
import re # precompiled from /usr/local/lib/python2.7/re.pyc
# /usr/local/lib/python2.7/sre_compile.pyc matches /usr/local/lib/python2.7/sre_compile.py
import sre_compile # precompiled from /usr/local/lib/python2.7/sre_compile.pyc
import _sre # builtin
# /usr/local/lib/python2.7/sre_parse.pyc matches /usr/local/lib/python2.7/sre_parse.py
import sre_parse # precompiled from /usr/local/lib/python2.7/sre_parse.pyc
...

Ответы

Ответ 1

_sre является встроенным модулем, поэтому нет файла для его включения, но он не имеет атрибута MAXREPEAT в Python 2.7.3:

>>> import _sre
>>> _sre
<module '_sre' (built-in)>
>>> _sre.MAXREPEAT
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'MAXREPEAT'

Мое лучшее предположение заключается в том, что у вашей замороженной копии есть стандартные модули .pypy из Python 2.7.4, но скомпилированный интерпретатор Python из версии 2.7.3 или более ранней версии. Я вижу, что вы работаете из /usr/local - возможно, он подбирает более старую версию из /usr.

Ответ 2

Я столкнулся с этой проблемой, когда только что обновился с ubuntu 12.10 до 13.04, и я исправил это, скопировав /usr/bin/python в/path/to/my/env/bin/, и он работал просто отлично

cp /user/bin/python /path/to/my/env/bin/

или, там более элегантный способ исправить это (ссылка):

mkvirtualenv <existing virtualenv name>

Ответ 4

У меня была такая же проблема в последнее время. Настройка LD_LIBRARY_PATH = решил проблему.

Ответ 5

Я использовал cx_freeze 4.3.2 на моей машине win 8, и он всегда показывал ImportError: cannot import name MAXREPEAT with cx Freeze, если я когда-либо пытался заморозить не встроенный модуль, и как только я скачал версию 4.3.1, он работает, m можно заморозить все мои программы python 3.3 без каких-либо проблем.

Ответ 6

У меня были похожие проблемы в Windows 8 - это была проблема PYTHONPATH. проверьте, существует ли PYTHONPATH, введя следующее в сеанс python:

  

import os

         

os.environ ['PYTHONPATH']. split (os.pathsep)

  

если вы получите ошибку, установите PYTHONPATH с помощью этого подхода.

Как добавить к pythonpath в Windows 7?