【问题标题】:ImportError with cx_freeze and pywin32: Module 'pythoncom' isn't in frozen sys.path带有 cx_freeze 和 pywin32 的 ImportError:模块“pythoncom”不在冻结的 sys.path 中
【发布时间】:2013-07-27 07:07:50
【问题描述】:

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

Traceback(最近一次调用最后一次):

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

文件“MyScript.py”,行 12、在

文件 “C:\Python\64-bit\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-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\pythoncom.py”,第 3 行,在
pywintypes._import_pywin32_system_module_("pythoncom", globals())

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

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

ImportError: Module 'pythoncom' is not in freeze sys.path

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

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

'C:\Python33\build\exe.win-amd64\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}})

到目前为止,我已经尝试在包含和包列表中同时列出“pythoncom”和“win32com”。非常感谢任何帮助!

【问题讨论】:

    标签: python-3.x pywin32 win32com cx-freeze pythoncom


    【解决方案1】:

    查看the code,您似乎需要确保将名为pythoncom33.dll 之类的文件复制到构建目录中。

    【讨论】:

    • 这是“冻结”python 应用程序时任何“找不到模块”问题的真正解决方案。
    【解决方案2】:

    所以整个问题实际上源于在运行 64 位版本的 Python-3.3.2 和 Windows 7 时安装了 32 位版本的 pywin32。在将 pythoncom33.dll 添加到我的 setup.py 的 include_files 后,作为 Thomas K 建议过,我又遇到了一个错误:

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

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

    导入win32api、sys、os

    ImportError: DLL load failed: 找不到指定的模块。

    按照this post 中的建议,我将 Lib/site-packages/win32 文件夹中的 28 个 win32*.pyd 文件复制到 python.exe 旁边的 Python33 文件夹中,一切正常。

    【讨论】:

    • Thomas 的答案似乎是正确的(我得到了与 OP 相同的错误,他的答案解决了它),而这个答案只解决了一个可能的次要问题。 IMO 这个答案应该合并到 Thomas 的答案中。
    【解决方案3】:

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

    【讨论】:

    • 从 pyinstaller 4.7 降级到 4.4 似乎工作正常
    • @Louis-PhilippeDescamps 啊。真的。不知道 4.7 发生了什么
    【解决方案4】:

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

    通过将路径添加到“include_files”参数来根据需要复制这些 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])
    

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      相关资源
      最近更新 更多