1

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

回溯(最近一次通话最后):

文件“C:\Python33\lib\site-packages\cx_Freeze\initscripts\Console3.py”,第 27 行,在 exec(code,m_ dict _)

<module> 中的文件“MyScript.py”,第 12 行

_find_and_load 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 1558 行

_find_and_load_unlocked 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 1505 行

_call_with_frames_removed 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 313 行

_find_and_load 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 1558 行

_find_and_load_unlocked 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 1525 行

文件“C:\Python33\lib\site-packages\win32com__init__.py”,第 6 行,在 <模块>

导入pythoncom

_find_and_load 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 1558 行

_find_and_load_unlocked 中的文件“C:\Python\64-bit\3.3\lib\importlib_bootstrap.py”,第 1525 行

文件“C:\Python33\lib\site-packages\pythoncom.py”,第 3 行,在
pywintypes._import_pywin32_system_module_("pythoncom", globals())

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

raise ImportError("Module '%s' is not in freeze sys.path %s" % (modname, sys.path))

ImportError:模块“pythoncom”不在冻结的 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”。任何帮助是极大的赞赏!

4

5 回答 5

2

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

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

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

导入win32api、sys、os

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

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

于 2013-07-30T14:42:34.227 回答
2

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

于 2013-07-29T13:59:39.850 回答
2

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

于 2021-12-10T22:06:29.827 回答
0

所以我遇到了一个类似的问题,其中 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])
于 2015-04-01T23:22:48.037 回答
0

更新 pyinstaller 相关的愿景。

python -m pip install pyinstaller==3.6
于 2022-01-10T00:45:57.010 回答