ImportError:在用cx_Freeze冻结的应用程序中导入win32clipboard时,DLL加载失败


问题内容

我有一个导入的Python 2.7程序win32clipboard。我尝试使用32位Windows XP SP3上的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 包含在构建中。

缺少什么依存关系,如何确保将其包括在内?


问题答案:

我终于想通这win32clipboard.pyd
被包括在内,但是,win32clipboard.pyd要看pywintypes27.dll,这cx_Freeze是 不是
抄袭c:\windows\system32

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

改进的方法是在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依赖关系,但我想那总是在进行中。)