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.dll
到build\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
依赖关系,但我想那总是在进行中。)