Python ImportError:在使用cx\U Freeze冻结的应用程序中导入win32clipboard时DLL加载失败
我有一个Python 2.7程序,可以导入Python ImportError:在使用cx\U Freeze冻结的应用程序中导入win32clipboard时DLL加载失败,python,windows,pywin32,cx-freeze,Python,Windows,Pywin32,Cx Freeze,我有一个Python 2.7程序,可以导入win32clipboard。我尝试在WindowsXPSP3 32位上使用cx_freeze 4.2.3冻结它,以创建安装MSI。我根据cx\U Freeze文档制作了一个setup.py,并使用了以下命令: c:\python27\python.exe setup.py bdist_msi 当我在另一台未安装Python 2.7的PC上运行它时,在导入win32clipboard的行上出现异常: ImportError: DLL load fail
win32clipboard
。我尝试在WindowsXPSP3 32位上使用cx_freeze 4.2.3冻结它,以创建安装MSI。我根据cx\U 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
被包含在构建中
缺少什么依赖项,我如何确保它被包括在内?我最终发现
win32clipboard.pyd
被包括在内,但是win32clipboard.pyd
依赖于pywintypes27.dll
,cx\u 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\u Freeze以自动检测
pywintype27.dll
依赖项,但我想这始终是一项正在进行的工作。)cx\u Freeze使用挂钩机制来处理这种情况。挂钩存储在模块cx\u 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\U Freeze已经有一个pywintypes钩子,可以复制相应的文件。谢谢您提供的信息。我以后会试试的。最后一行看起来像是一个奇怪的API,实际上是在修补
cx\u Freeze.hooks
模块。