py2exe: 错误:libzmq.pyd:没有此文件或目录

5 投票
4 回答
6788 浏览
提问于 2025-04-17 15:51

在使用py2exe构建的时候,我遇到了以下错误:

creating python loader for extension 'win32clipboard' (C:\Python27\lib\site-packages\win32\win32clipboard.pyd -> win32clipboard.pyd)
creating python loader for extension '_rl_accel' (C:\Python27\lib\site-packages\_rl_accel.pyd -> _rl_accel.pyd)
*** finding dlls needed ***
error: libzmq.pyd: No such file or directory

有没有人能告诉我,我到底需不需要这个?在哪里可以找到它,或者我该怎么把它排除掉。

谢谢,Mads

4 个回答

1

我不确定这是不是最好的解决办法,但对我来说有效:

  • http://pypi.python.org/pypi/pyzmq 下载 pyzmq。
  • 使用 easy_install 安装这个包。
  • 把 C:\Python27\Lib\site-packages\pyzmq-2.2.0.1-py2.7-win32.egg\zmq 里的 libzmq.dll 复制到 C:\Python27\dlls\ 目录下。

Mads

3

很遗憾,这个答案并不是很好,但我觉得它对问题的诊断还算不错。

py2exe的维基页面似乎没有更新(至少我觉得是这样)。我认为在13.0.0版本中,libzmq.pyd替代了libzmq.dll。py2exe对扩展模块的正常处理会把这个文件重命名为“zmq.libzmq.pyd”,但这样会导致Windows找不到dll文件,因为(例如)zmq.core._device.pyd是明确链接到libzmq.pyd的。

因此,有一个比较麻烦的解决办法,就是把zmq.libzmq.pyd复制到py2exe生成的dist文件夹中,并命名为libzmq.pyd。使用这个方法后,我的py2exe生成的exe文件可以正常运行,没有导入错误。

10

要让它正常工作,需要三个步骤:

  • 在使用 dll_excludes 选项时,把 libzmq.pyd 排除在外。这样可以避免出现“缺少 pyzmq.pyd”的错误。
  • 同样地,在使用 excludes 选项时,把 zmq.libzmq 排除在外。这可以跳过 py2exe 通常会进行的 .pyd 重命名和代理处理。
  • 要明确地使用 includes 选项添加 zmq.backend.cython,因为 py2exe 通过 pyzmq 后端选择代码无法看到它。如果不这样做,你会遇到“没有名为 cffi 的模块”的错误。

示例:

import zmq.libzmq

setup(
    # ...
    zipfile='lib/library.zip',
    options={
        'py2exe': {
            'includes': ['zmq.backend.cython'],
            'excludes': ['zmq.libzmq'],
            'dll_excludes': ['libzmq.pyd'],
        }
    },
    data_files=[
        ('lib', (zmq.libzmq.__file__,))
    ]
)

撰写回答