Python编写的com组件发生R6034错误的原因与解决办法
问题描述
R6034错误 是 Windows 程序在启动时出现的常见错误之一。当使用 Python 编写的 COM 组件运行在 Windows 上时,有时会遇到此类错误,使得组件无法正常运行。
这是因为 Windows 系统和 Visual C++ 运行时库遇到了不匹配的运行时库版本而导致的错误。通常,这种错误的原因是 Python 组件中使用的某些库与 Windows 系统中的不兼容,或者直接与 Windows 系统中的依赖发生了冲突。
解决办法
方案一:使用 Visual C++ Redistributable for Visual Studio
首先要确定问题所处的位置。当 Python 组件在 Windows 平台上无法正常运行时,可以尝试安装 Visual C++ Redistributable for Visual Studio。这样,你的组件就可以在安装运行时组件的计算机上运行了。下载地址:https://aka.ms/vs/16/release/vc_redist.x86.exe
。如果你的 Python 组件是 64 位的,需要下载 x64 版本。
如果你的组件成功运行了,那么这很可能是你组件发生 R6034 错误的原因。如果安装此运行时库无法解决问题,请继续阅读后续解决方案。
方案二:调整 Python 编译器的选项
有些时候,Python 编译器的选项可能不在最佳状态,导致了组件和依赖项之间的不兼容。为此,你可以尝试打开并调整编译器选项。
- 打开编辑器或 IDE
- 打开 Python 项目
- 找到并打开 .pyproj 文件
- 找到
<PropertyGroup>
元素 - 在其中添加以下元素:
xml
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<UseOfMfc>true</UseOfMfc>
<UseOfAtl>true</UseOfAtl>
- 保存文件并重新生成整个解决方案
如果这样做解决问题了,那么你的组件应该能够始终正常运行,而不会遇到 R6034 错误。
示例1:解决方案二的代码示例
<PropertyGroup>
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<UseOfMfc>true</UseOfMfc>
<UseOfAtl>true</UseOfAtl>
<TargetPlatformVersion>10.0.18362.0</TargetPlatformVersion>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
在 PropertyGroup
所在节点添加了 RuntimeLibrary
、UseOfMfc
和 UseOfAtl
元素 。
方案三:使用Manifest文件
如果以上两种方法都没有解决问题,你可以尝试手动编写并使用 Manifest 文件,来指定 Python 和依赖之间的正确性质。
首先,创建一个名称为 python.manifest
的文件,并将以下文本复制粘贴到其中:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version ="8.0.50608.0" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86"/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version ="9.0.21022.8" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86"/>
</dependentAssembly>
</dependency>
</assembly>
这个 Manifest 文件可以指定程序依赖的 DLL。当使用 Visual Studio 之类的 IDE 开发时,可以在文件的属性中添加或编辑。如果你手动编写 Manifest 文件,请确保文件与 COM 组件所在目录相同,同时文件名称为 python.manifest
。
示例2:使用 Manifest 文件的代码示例
<PropertyGroup>
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<ManifestFile>$(InputName).manifest</ManifestFile>
<TargetPlatformVersion>10.0.18362.0</TargetPlatformVersion>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
在 PropertyGroup
所在节点添加了 ManifestFile
元素,并设置值为 $(InputName).manifest
。
总结
以上三种解决方案适用于大多数 Python COM 组件中可能出现的 R6034 错误。首先可以尝试安装依赖程序,其次可以通过调整项目属性和结构来解决,最后可以考虑通过手动编写 Manifest 文件来解决问题。如果以上解决方案均无法解决问题,可以考虑在社区等渠道寻求更高级别的解决方案。