VB.net中使用PythonNet初始化Python引擎报错的解决方法
问题描述
尝试使用PythonNet在VB.NET中执行Python脚本时,在PythonEngine.Initialize()行触发错误:
System.TypeInitializationException: 'The type initializer for 'Delegates' threw an exception.'
已尝试调整路径正反斜杠、使用指定python310.dll的Initialize重载,但问题未解决。代码示例如下:
Imports Python.Runtime Public Class Form1 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Runtime.PythonDLL = "C:\Users\realt\anaconda3\python310.dll" PythonEngine.Initialize() Using Py.GIL() Dim np As Object = Py.Import("numpy") TextBox3.Text = ToString(np.cos(np.pi * 2)) End Using End Sub End Class
注:代码由pythonnet官方C#示例转换为VB.NET版本。
解决步骤
匹配项目与Python架构
检查VB.NET项目的目标平台(x86/x64)是否与Anaconda Python的架构一致。在Visual Studio中右键项目→属性→生成→平台目标,选择对应架构(如Anaconda是64位则选x64)。配置Python环境变量
在PythonEngine.Initialize()前添加环境变量配置,确保PythonNet能正确识别环境:Environment.SetEnvironmentVariable("PYTHONHOME", "C:\Users\realt\anaconda3") Environment.SetEnvironmentVariable("PYTHONPATH", "C:\Users\realt\anaconda3\Lib;C:\Users\realt\anaconda3\Lib\site-packages")验证pythonnet版本兼容性
确保安装的pythonnet版本支持Python 3.10。可通过NuGet为项目安装对应版本,或激活Anaconda环境后执行pip install pythonnet安装适配版本。添加Python目录到系统PATH
在设置Runtime.PythonDLL后,将Python DLL所在目录添加到PATH,避免依赖加载失败:Dim pythonDir As String = System.IO.Path.GetDirectoryName(Runtime.PythonDLL) Environment.SetEnvironmentVariable("PATH", $"{pythonDir};{Environment.GetEnvironmentVariable("PATH")}")确保引擎初始化唯一性
避免多次调用PythonEngine.Initialize(),若之前初始化失败,可在重启初始化前调用PythonEngine.Shutdown()(仅在已初始化的情况下执行)。
内容的提问来源于stack exchange,提问作者Jamie

