Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ImportError:在使用cx\U Freeze冻结的应用程序中导入win32clipboard时DLL加载失败_Python_Windows_Pywin32_Cx Freeze - Fatal编程技术网

Python ImportError:在使用cx\U Freeze冻结的应用程序中导入win32clipboard时DLL加载失败

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

我有一个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 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
模块。