在无Python环境的C#项目中嵌入Python库(SciPy)的问题求助
解决Pythonnet加载本地Python库的问题
步骤1:准备本地Python库文件
- 在本地安装与
python311.dll版本完全匹配的Python 3.11环境,通过pip安装numpy、scipy及所有依赖库。 - 找到Python安装目录下的
Lib\site-packages文件夹,将其中的numpy、scipy文件夹,以及它们依赖的第三方库(如mkl_*、pyparsing等)复制到你的C#解决方案目录下的自定义文件夹(比如命名为PythonLibs)。
步骤2:在C#代码中配置Python模块搜索路径
在初始化Pythonnet引擎后,手动将本地库目录添加到Python的模块搜索路径中,示例代码如下:
using Python.Runtime; using System; class Program { static void Main(string[] args) { // 指定本地python311.dll的路径 Runtime.PythonDLL = @"./python311.dll"; // 初始化Python运行时 PythonEngine.Initialize(); try { // 获取Python的sys模块 dynamic sys = Py.Import("sys"); // 将本地库目录添加到模块搜索路径 sys.path.Append(@"./PythonLibs"); // 尝试导入numpy验证 dynamic np = Py.Import("numpy"); Console.WriteLine($"Numpy导入成功,版本:{np.__version__}"); // 导入scipy dynamic scipy = Py.Import("scipy"); Console.WriteLine($"Scipy导入成功,版本:{scipy.__version__}"); } catch (PythonException ex) { Console.WriteLine($"导入失败:{ex.Message}"); } finally { // 关闭Python引擎 PythonEngine.Shutdown(); } } }
注意事项
- 确保复制的所有库版本与
python311.dll的Python版本完全一致,否则会出现兼容性错误。 - 部分库依赖原生DLL文件(如numpy的
_multiarray_umath.pyd依赖的MKL动态库),需要将这些DLL一并复制到C#程序的运行目录下。 - 部署时,需将
python311.dll、PythonLibs文件夹及C#编译后的程序文件一起打包分发。
替代方案:使用嵌入式Python包
- 从Python官网下载对应版本的嵌入式Python包(如Python 3.11 Embedded Package),解压到解决方案目录。
- 打开命令行,进入嵌入式Python目录,执行命令安装所需库到本地:
.\python.exe -m pip install numpy scipy --target .\Lib\site-packages - 在C#代码中,将
Runtime.PythonDLL指向嵌入式Python的python311.dll,并将嵌入式Python的Lib\site-packages路径添加到sys.path,这种方式能更完整地包含所有依赖,减少遗漏。
内容的提问来源于stack exchange,提问作者Justin8051
相关产品推荐
相关产品推荐

