py2exe: 错误:libzmq.pyd:没有此文件或目录
在使用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__,))
]
)