如何在 python cx_freeze 应用程序中包含 Microsoft Visual C++ Redistributable 包

How to include a Microsoft Visual C++ Redistributable package in a python cx_freeze application

上下文

我正在尝试使用 cx_freeze 构建一个 python tkinter 应用程序,并且我成功构建了 .exe。这是我的 setup.py:

import sys
from cx_Freeze import setup, Executable

version = "0.7.6"
author = "Me"

base = None

if sys.platform == "win32":
    base = "Win32GUI"

build_exe_options = {"include_files": ["assets/", "files/"], "excludes": ["matplotlib.tests", "numpy.random._examples"], 
"include_msvcr": True}

setup(
    name="Application",
    version=version,
    description=f"Application {version}",
    author=author,
    options={"build_exe": build_exe_options},
    executables=[Executable(script="main.py", base=base, targetName="App.exe", icon="assets/Logo.ico")]
)

问题的确定

然而,我在 Python 代码中使用的一些库,如 matplotlib,只能使用 Visual Studio 2015 或更高版本编译(参见 documentation)。我的计算机上有 Visual Studio 2019,所以一切正常,但我在另一台 Windows 计算机上尝试了 运行 该应用程序,该计算机只有 Microsoft Visual C++ 2010 Redistributable 软件包(我猜 2010编译工具),应用程序在启动前崩溃并出现以下主要错误:

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

根据讨论 here, I figured this error means that Visual Studio requirements are not met (i.e 2015 or later) and as indicated at the end of this discussion,matplotlib wheels 不包含版本 > 3.3.0 的 C++ 运行时 DLL。在问我的问题之前,我必须说我对 python 库是如何编译的或者轮子是什么的理解非常有限,我什至不知道我构建的应用程序的编译涉及哪些 C++ 运行时 DLL。

问题

如何在我的应用程序中包含 Microsoft Visual C++ 2015 Redistributable 包(假设它是合法的)?

对我来说一个简单的解决方案是在我的项目中包含所有必要的依赖项,而无需用户在其计算机上安装 Visual Studio C++ 2015+ 版本,所以如果您对如何实现有任何想法cx_freeze 甚至我可能会研究的其他一些工具,在此先感谢您的帮助。

保罗

P.S:如您所见,我尝试了 build_exe_options 中的 "include_msvcr" 键,但这并没有解决我的问题(而且我认为 msvcp.dll 是默认包含)

更新

我在目录中手动添加了 vcruntime140_1.dll、msvcp140_1.dll 并且应用程序正在启动,但是 window 没有正确显示,它的框架没有出现,所以问题还没解决

如果安装了 Windows Kits,您应该转到 C:\Program Files (x86)\Windows Kits 位置并确定合适的 python 架构。 如果应用程序是 64 位,则会创建位置类型:C:\Program Files (x86)\Windows Kits\Redist\ucrt\DLLs\x64

您必须复制所有 DLL。

但是,这可能效果不佳。我推荐 运行 依赖工具。这有助于您找到正确的 DLL。

Dependencies

您应该分析 pythonVxVx.dll (python38.dll) 文件和 yourapp.exe 文件。