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:无法导入名称设置

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__

ImportError:运行我的应用程序时没有名为“队列”的模块被 cx_freeze 冻结