首页 > 解决方案 > 如何在 python cx_freeze 应用程序中包含 Microsoft Visual C++ Redistributable 包

问题描述

语境

我正在尝试使用 构建 python tkinter 应用程序cx_freeze,并且成功构建了 .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 或更高版本进行编译(请参阅文档)。我的计算机上有 Visual Studio 2019,所以一切正常,但我尝试在另一台只有 Microsoft Visual C++ 2010 Redistributable 包(我猜是 2010 编译工具)的 Windows 计算机上运行该应用程序,并且该应用程序在启动前崩溃了这个主要错误:

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

根据此处的讨论,我认为此错误意味着未满足 Visual Studio 要求(即 2015 或更高版本),并且如本讨论末尾所示,matplotlib 轮子不包含版本 > 3.3.0 的 C++ 运行时 DLL。在问我的问题之前,我必须说我对如何编译 python 库或轮子的理解非常有限,我什至不知道哪些 C++ 运行时 DLL 参与了我构建的应用程序的编译。

问题

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

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

保罗

PS:如您所见,我尝试了"include_msvcr"build_exe_options 中的密钥,但这并没有解决我的问题(另外我认为 msvcp.dll 默认包含在内)

更新

我手动在目录中包含了vcruntime140_1.dll、msvcp140_1.dll,应用程序现在正在启动,但是窗口显示不正确,没有出现它的框架,所以问题还没有解决。

标签: pythonwindowsvisual-c++cx-freeze

解决方案


如果安装了Windows 工具包,您应该前往该C:\Program Files (x86)\Windows Kits位置并决定适合您的 Python 架构。如果应用程序是 64 位,则创建位置类型:C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64

您必须复制所有 DLL。

但是,这可能效果不佳。我建议运行依赖工具。这可以帮助您找到正确的 DLL。

依赖项

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


推荐阅读