带有 cx_freeze 和 pywin32 的 ImportError:模块 'pythoncom' 不在冻结的 sys.path 中



我正试图在Windows 7上使用cx_freeze从python3脚本创建.exe。脚本涉及使用pywin32来操作Excel文件。我可以从我的setup.py文件成功地构建.exe;但是,当我运行.exe时,会抛出以下错误:

追踪(最近一次通话):

文件"C:\Python33\lib\site packages\cx_Freeze\initscripts\Console3.py",第27行,在exec(代码,m_dict_)中

文件"MyScript.py",第行12,在<模块>

文件"C:\Python\64位\3.3\lib\importlib_bootstrap.py",第1558行,位于_find_and_load

文件"C:\Python\64 bit\3.3\lib\importlib_bootstrap.py",第1505行,位于_find_and_load_unlocked

文件"C:\Python\64 bit\3.3\lib\importlib_bootstrap.py",第313行,位于_call_with_frames_removed

文件"C:\Python\64 bit\3.3\lib\importlib_bootstrap.py",第1558行,位于_find_and_load

文件"C:\Python\64 bit\3.3\lib\importlib_bootstrap.py",第1525行,位于_find_and_load_unlocked

文件"C:\Python33\lib\site packages\win32com__init__.py",第6行,位于<模块>

导入pythoncom

文件"C:\Python\64位\3.3\lib\importlib_bootstrap.py",第1558行,位于_find_and_load

文件"C:\Python\64 bit\3.3\lib\importlib_bootstrap.py",第1525行,位于_find_and_load_unlocked


中的文件"C:\Python33\lib\site packages\pythoncom.py",第3行pywintypes_import_pywin32_system_module_("pythoncom",globals())

文件"C:\Python33\lib\site packages\win32\lib\pywintypes.py",第61行,在_import_pywin32_system_module_中

引发ImportError("模块'%s'不在冻结的sys.path%s"%(modname,sys.path))中

ImportError:模块"pythoncom"不在冻结的系统路径中

['C:\Python33\build.exe.win-amd64\3.3\MyScript.exe',

'C:\Python33\build.exe.win-amd64\3.3',

"C:\Python33\build\exe.win-ad64\3.3\MyScript.zip",

'C:\Python33\build\exe.win-amd64\3.3\library.zip']

以下是我的setup.py文件当前的样子:

import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == 'win32':
    base = 'Win32GUI'
includes = []
packages = []
executables = [Executable('MyScript.py', base=base)]
include_files = ['MyFolder1/','MyFolder2/Spreadsheet.xls']
setup(name='My Script',
      version='0.1',
      description='My Script',
      executables=executables,
      options = {'build_exe': {'includes':includes,
                               'packages':packages,
                               'include_msvcr':True,
                               'include_files':include_files}})

到目前为止,我已经尝试在includes和packages列表中同时列出"pythoncom"one_answers"win32com"。非常感谢您的帮助!

我在使用pyinstaller将py打包到可执行文件时遇到了完全相同的问题。尝试了一切,但发现问题隐藏在pyinstaller版本中。我使用的是pyinstaller 4.7,但当降级到3.6时,exe可以完美地工作。

查看代码,似乎需要确保一个名为pythoncom33.dll的文件被复制到构建目录中。

因此,整个问题实际上源于在运行64位版本的Python--3.2和Windows7时安装了32位版本的pywin32。按照Thomas K的建议,在将pythoncom33.dll添加到我的setup.py的include_files后,我得到了另一个错误:

ImportError:DLL加载失败:%1不是有效的Win32应用程序

经过一些研究,我发现这种错误在混合32位和64位时是典型的。所以我卸载了32位的pywin32,安装了64位的pywin32,但我的脚本又出现了另一个错误:

导入win32api、sys、os

ImportError:DLL加载失败:找不到指定的模块。

正如这篇文章中所建议的,我将Lib/site packages/win32文件夹中的28个win32*.pyd文件复制到python.exe旁边的Python33文件夹中,一切都正常了。

将其添加到您的主文件顶部。py:

导入pywintypes

导入win32api

请参阅:PyWin32和Python 3.8.0

所以我遇到了一个类似的问题,cx_Freeze无法插入pywintypes DLL,但令人沮丧的是,它只是在一些机器上,这迫使我进一步探索这个问题(我有一个追逐兔子的坏习惯)。pywin32似乎试图将其DLL安装到Windows系统目录中,但如果由于缺乏权限而失败,它将回退到Python目录中。我看到的行为是由于cx_Freeze将已知系统文件夹路径的黑名单应用于它发现的依赖项集合,以避免拉入操作系统DLL。

根据需要,通过在"include_files"参数中添加这些DLL的路径来复制这些DLL确实可以解决这个问题(请记住,您不能保证它们会放在系统文件夹中)。另一种解决方案是用白名单覆盖黑名单,您可以使用"bin_includes"/"bin_path_includes"参数进行配置。下面是一个快速示例,展示了如何使用setup.py文件配置此参数(对于Python 2.7,但唯一的区别应该是pywintypes DLL文件名):

from cx_Freeze import setup, Executable
# This can also be an absolute path to the file if you wish to be very specific
bin_includes = ["pywintypes27.dll"]
options = {
    "build_exe": {
        "bin_includes": bin_includes
    }
}
executable = Executable(script='main.py')
setup(version='x.x.x',
      options=options,
      executables=[executable])

更新pyinstaller相关的视觉。

python -m pip install pyinstaller==3.6

最新更新