Python.NET设置PYTHONNET_PYDLL路径:Python3.11失效但3.8正常
解决Python.NET适配Python 3.11加载自定义路径失败的问题
针对你遇到的Python.NET 3.0.3在Python 3.8可正常加载自定义python.dll,但3.11版本报错DllNotFoundException的问题,可按以下步骤排查解决:
1. 安装对应版本的VC++运行时库
Python 3.11依赖Visual Studio 2019/2022版本的VC++ Redistributable包(需和你的Python架构匹配:x64或x86)。如果系统缺少这个运行时,即使python311.dll路径正确,也会因依赖缺失无法加载。
2. 补充设置PATH环境变量
在设置PYTHONHOME和PYTHONNET_PYDLL后,需将Python 3.11的根目录添加到系统PATH最前端,确保加载python311.dll时能找到其依赖的其他dll文件:
System.Environment.SetEnvironmentVariable("PYTHONHOME", @"D:\Test\CondaTest"); System.Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", @"D:\Test\CondaTest\python311.dll"); // 添加Python目录到PATH最前 var currentPath = System.Environment.GetEnvironmentVariable("PATH"); System.Environment.SetEnvironmentVariable("PATH", @"D:\Test\CondaTest;" + currentPath); PythonEngine.Initialize(); using (Py.GIL()) { dynamic np = Py.Import("numpy"); Console.WriteLine(np.cos(np.pi * 2)); } PythonEngine.Shutdown();
3. 显式预加载python311.dll
通过NativeLibrary显式加载dll后再初始化PythonEngine,绕开自动加载的潜在问题:
using System.Runtime.InteropServices; // 先显式加载目标dll NativeLibrary.Load(@"D:\Test\CondaTest\python311.dll"); // 再设置环境变量并初始化引擎 System.Environment.SetEnvironmentVariable("PYTHONHOME", @"D:\Test\CondaTest"); System.Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", @"D:\Test\CondaTest\python311.dll"); PythonEngine.Initialize(); using (Py.GIL()) { dynamic np = Py.Import("numpy"); Console.WriteLine(np.cos(np.pi * 2)); } PythonEngine.Shutdown();
4. 确认架构匹配
检查你的.NET程序编译架构(x64/x86)是否和Python 3.11的架构完全一致。比如Python是x64版本,.NET程序不能设置为x86编译,否则会因架构不兼容导致dll加载失败。
5. 升级Python.NET版本
Python.NET 3.0.3对Python 3.11的兼容性可能存在已知问题,升级到最新稳定版本(如3.1.0及以上)可以修复部分适配bug。
内容的提问来源于stack exchange,提问作者Websterek
相关产品推荐
相关产品推荐

