3

我有一个 Python 2.7 程序可以导入win32clipboard. 我尝试在 Windows XP SP3 32 位上使用 cx_Freeze 4.2.3 冻结它,以创建安装 MSI。我setup.py根据 cx_Freeze 文档做了一个,并使用了以下命令:

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 包含在构建中。

缺少什么依赖项,我如何确保它被包含在内?

4

2 回答 2

4

我最终认为它win32clipboard.pyd 包括在内,但是,win32clipboard.pyd取决于pywintypes27.dllcx_Freeze没有从 .cx_Freeze 复制c:\windows\system32

短期破解是手动复制c:\windows\system32\pywintypes27.dllbuild\exe.win32-2.7,然后setup.py bdist_msi再次运行。

改进的 hack 是在 setup.py 中使用以下内容:

import os
import sys
import win32api
...
pywintypes_dll = 'pywintypes{0}{1}.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依赖关系,但我想这始终是一个正在进行的工作。)

于 2012-06-21T02:02:23.783 回答
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 挂钩,可以复制相应的文件。

于 2012-12-04T22:38:58.007 回答