【问题标题】:ImportError: cannot import name MAXREPEAT with cx_FreezeImportError:无法使用 cx_Freeze 导入名称 MAXREPEAT
【发布时间】:2013-04-24 11:34:16
【问题描述】:

我在运行冻结的应用程序时遇到了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_Freezes 设置包含列表中显式命名模块并且是solution to this similar question 来修复,但这在这里没有帮助。

这个_sre 模块看起来很奇怪.. 生成的library.zip 中没有_sre 文件,但是从那个错误看来它可以找到它,但是它不能导入那个符号?当然,如果该模块不存在,那将是“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)>"

这是similar to this question,也是最近被问到的,但在这种情况下,他在常规解释器中遇到了错误,但对我来说它只是在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
...

【问题讨论】:

    标签: python python-2.7 cx-freeze


    【解决方案1】:

    我刚从 ubuntu 12.10 升级到 13.04 时遇到了这个问题,我通过将 /usr/bin/python 复制到 /path/to/my/env/bin/ 来解决这个问题,它工作得很好

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

    或者,有一个更优雅的方法来解决这个问题(reference):

    mkvirtualenv <existing virtualenv name>

    【讨论】:

    • 正如在同一个引用问题中所建议的,virtualenv &lt;existing virtualenv name&gt; 允许您在不使用 virtualenvwrapper 的情况下更新 virtualenv。
    • mkvirtualenv 非常完美,谢谢。如果有人担心它会破坏 virtualenv 中的其他文件,它不会!!
    • 从 ubuntu 12.10 升级到 13.04 并面临同样的问题。在现有的 virtualenv 上运行 virtualenv ,这解决了这个问题。谢谢。
    【解决方案2】:

    _sre 是一个built in module,因此没有要包含的文件,但它在 Python 2.7.3 中没有 MAXREPEAT 属性:

    >>> 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'
    

    我最好的猜测是,您的冻结副本不知何故具有来自 Python 2.7.4 的标准库 .py 模块,但是来自 2.7.3 或更早版本的编译 Python 解释器。我看到你正在使用 /usr/local 工作 - 也许它正在从 /usr 获取旧版本。

    【讨论】:

    • cx_Freeze 如何找到要使用的解释器?通过查看$PATH?我试试把第一行的python版本号打印出来看看。
    • 顺便说一句:) print sys.version 在第一行显示冻结版本中的解释器是 2.7.3。我想线索是 _sre 是在解释器启动时导入的 2.7.4 但在我冻结的应用程序中,它后来在我做 import dbus 时被抛出。
    • 好的,我想我会清除2.7.3 的版本,所以它不会接收它.. 但似乎我没有2.7.3 的版本!我在/usr/local 中有2.7.4,在/usr 中有2.6.6。知道这是怎么发生的吗?
    • 什么都没有想到。您可以尝试locate libpython2.7 寻找其他副本。否则,请尝试清除所有对系统不必要的内容(即不要从 /usr 中删除副本 - 大多数 Linux 系统都大量使用 Python),然后重新安装。
    • 擦除 python 并重新安装确实解决了这个问题,谢谢。我认为 2.7.3 之前就在那里,并且 2.7.4 必须安装在它的顶部,可能留下一些 0.3 位。谢谢你的线索!
    【解决方案3】:

    如果一切都失败了,我可以使用这个来运行:http://www.kiwisoft.co.uk/blog/2014/08/17/fixed-importerror-cannot-import-name-maxrepeat

    【讨论】:

      【解决方案4】:

      我最近遇到了同样的问题。设置 LD_LIBRARY_PATH= 解决了问题。

      【讨论】:

        【解决方案5】:

        我在我的 win 8 机器上使用 cx_freeze 4.3.2,如果我尝试冻结非内置模块,它总是显示ImportError: cannot import name MAXREPEAT with cx Freeze,一旦我下载了 4.3.1 版,它就可以工作了,我'我现在可以毫无问题地冻结我所有的 python 3.3 程序。

        【讨论】:

          【解决方案6】:

          我在 Windows 8 上遇到了类似的问题 - 只是 PYTHONPATH 问题。通过在 python 会话中键入以下内容来检查 PYTHONPATH 是否存在:

          导入操作系统

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

          如果您遇到错误,请使用此方法设置您的 PYTHONPATH..

          How to add to the pythonpath in windows 7?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-03
            • 2016-03-31
            • 2014-01-08
            • 2023-04-05
            相关资源
            最近更新 更多