在 Python 中使用 cx_freeze 时未添加 VCRUNTIME140.DLL

VCRUNTIME140.DLL is not getting added when using cx_freeze in Python

我对 Python 很陌生。我刚刚编写了一个程序来检查服务器上次重启的时间并向我们的团队发送电子邮件。我们有 30 多台服务器,不可能在每台服务器上都安装 python。所以我使用 cx_freeze 创建了一个可执行文件。下面是我的 setup.py 文件。

from cx_Freeze import setup, Executable

setup(
    name = "RebootChecker",
    version = "1.0",
    description = "A Script to check the last reboot time of servers",
    options = {
        "build_exe": {              
            "include_msvcr": True,
            "add_to_path": True,
        }
    },
    executables = [Executable("RebootTester.py", base = "Win32GUI")]
)

exe 文件在我的计算机上运行文件,但是当我在服务器上尝试它时它不起作用。它崩溃并出现错误 - "The program cannot start because VCRUNTIME.DLL is missing from your computer",即使 DLL 在 C:\Windows\System32 中可用。我发现 python 可执行文件的构建文件夹中缺少 DLL。所以我手动将 DLL 复制到 exe 所在的文件夹,但出现错误 - 应用程序无法正确启动 (0xc000007b)。点击确定关闭应用程序

我还尝试通过将以下行添加到 setup.py 文件来修改 build_exe 来添加 DLL 文件,但得到了与上面相同的错误。

python_dir = os.path.dirname(sys.executable)
"include_files": [os.path.join(python_dir, "vcruntime140.dll")]

我什至尝试修复 "Microsoft C++ Redistributable" 应用程序,但无济于事。

我在 github post 上看到这是 cx_freeze 版本 5.0.2 上的一个已知问题,其中 Visual studio 包即使添加后也没有添加"include_msvcr": True,不过我用的是6.1版本。

SO上的其他答案只给出了上述方法作为解决方案,它们对我不起作用。

我如何让它工作?我已经研究了几个小时了。对此的任何帮助表示赞赏。

谢谢!

您的真正问题似乎是 32 位 Python 在 64 位 Windows 下的那台机器上是 运行。我想您安装的 Microsoft C++ Redistributable 也是 64 位的。

  • 无法找到 vcruntime140.dll 文件,因为它的 32 位版本(应该在 C:\Windows\SysWOW64 下)可能不存在。
  • 当从 C:\Windows\System32 手动复制文件时(这将是 64 位版本!)它失败并显示 0xc000007b 这是 STATUS_INVALID_IMAGE_FORMAT 的代码,因为现在是 32 -bit python.exe 正在尝试加载 64 位 vcruntime140.dll.

我建议在 64 位机器上使用 64 位 Python。