15

我在运行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设置包含列表中显式命名模块来修复,并且是此类似问题的解决方案,但这在这里没有帮助。

这个_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
...
4

6 回答 6

32

我刚从 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>

于 2013-05-21T06:17:38.227 回答
14

_sre是一个内置模块,因此没有要包含的文件,但它在 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.

于 2013-04-30T21:53:19.843 回答
2

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

于 2013-09-04T19:28:42.497 回答
1

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

于 2014-02-18T22:44:45.170 回答
1

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

于 2014-04-09T02:17:07.070 回答
0

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

导入操作系统

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

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

如何在 Windows 7 中添加到 pythonpath?

于 2014-04-30T02:34:18.483 回答