ImportError:在使用 cx_Freeze 冻结的应用程序中导入 win32clipboard 时,DLL 加载失败
Posted
技术标签:
【中文标题】ImportError:在使用 cx_Freeze 冻结的应用程序中导入 win32clipboard 时,DLL 加载失败【英文标题】:ImportError: DLL load failed when importing win32clipboard in application frozen with cx_Freeze 【发布时间】:2012-06-21 02:01:15 【问题描述】:我有一个导入 win32clipboard
的 Python 2.7 程序。我尝试在 Windows XP SP3 32 位上使用 cx_Freeze 4.2.3 冻结它,以创建安装 MSI。我根据 cx_Freeze 文档做了一个setup.py
,并使用了以下命令:
c:\python27\python.exe setup.py bdist_msi
当我在另一台未安装 Python 2.7 的 PC 上运行它时,在导入 win32clipboard
的行上出现异常:
ImportError: DLL load failed: The specified module could not be found.
我可以看到win32clipboard.pyd
包含在构建中。
缺少哪些依赖项,如何确保包含它?
【问题讨论】:
【参考方案1】:我最终发现 win32clipboard.pyd
被包括在内,但是,win32clipboard.pyd
依赖于 pywintypes27.dll
,cx_Freeze 不是从 c:\windows\system32
复制的。
短期破解是手动将c:\windows\system32\pywintypes27.dll
复制到build\exe.win32-2.7
,然后再次运行setup.py bdist_msi
。
一种改进的技巧是在 setup.py 中使用以下内容:
import os
import sys
import win32api
...
pywintypes_dll = 'pywintypes01.dll'.format(*sys.version_info[0:2]) # e.g. pywintypes27.dll
build_exe_options = ..., "include_files": [ (os.path.join(win32api.GetSystemDirectory(), pywintypes_dll), pywintypes_dll)]
...
setup( ...,
options = 'build_exe': build_exe_options,
...,
,
...)
(最好改进 cx_Freeze 以自动检测 pywintype27.dll
依赖项,但我想这始终是一项正在进行的工作。)
【讨论】:
【参考方案2】:cx_Freeze 使用挂钩机制来处理这种情况。挂钩存储在模块cx_Freeze.hooks
中。每个钩子都以正在调查的操作、加载或丢失以及模块名称命名。模块本身提供了很多示例。
以下是您处理 win32clipboard 模块的方法:
from cx_Freeze import hooks
def load_win32clipboard(finder, module):
finder.IncludeModule("pywintypes")
hooks.load_win32clipboard = load_win32clipboard
...
现在当cx_Freeze遇到win32clipboard时,也会包含pywintypes。 cx_Freeze 已经有一个 pywintypes 挂钩,可以复制相应的文件。
【讨论】:
感谢您的信息。有时间我会试试的。最后一行看起来像一个奇怪的 API——实际上,猴子修补了cx_Freeze.hooks
模块。以上是关于ImportError:在使用 cx_Freeze 冻结的应用程序中导入 win32clipboard 时,DLL 加载失败的主要内容,如果未能解决你的问题,请参考以下文章
cx_Freeze- ImportError:无法导入名称设置
PySide (1.1.2), cx_freeze, WinXP, Python 3.3: ImportError: DLL load failed
Python 2.7 Cx_Freeze: ImportError: No module named __startup__
Python 2.7 Cx_Freeze: ImportError: No module named __startup__