使用Python.Runtime从C#调用Python函数时提示No module named Numpy错误排查
这种情况我碰到过好多次,核心问题基本都是C#进程没关联到你安装Numpy的那个Python环境,不是Numpy真的没装。下面给你拆解几个最常见的原因和解决办法:
1. Python环境路径没配置正确
Python.Runtime默认会找系统默认的Python解释器,但如果你是用虚拟环境、Anaconda或者自定义路径安装的Python,C#根本找不到你装了Numpy的那个环境。
解决办法是在初始化Python引擎前,手动指定Python的安装目录:
// 替换成你实际的Python安装目录(比如虚拟环境根目录、Anaconda目录) string pythonHome = @"C:\Users\你的用户名\AppData\Local\Programs\Python\Python310"; PythonEngine.PythonHome = pythonHome; // 把Python的DLL和Scripts目录加到系统PATH,确保能找到依赖 string originalPath = Environment.GetEnvironmentVariable("PATH"); Environment.SetEnvironmentVariable("PATH", $@"{pythonHome}\DLLs;{pythonHome}\Scripts;{originalPath}");
2. 虚拟环境没被正确识别
如果你用了虚拟环境,一定要让C#指向虚拟环境内的Python,而不是全局Python。比如你的虚拟环境在项目根目录的venv文件夹下,那PythonHome应该设为@".\venv",同时把venv\Scripts和venv\DLLs(如果有的话)加到PATH里。
3. 位数不匹配(最容易忽略的坑)
Python分32位和64位,C#项目的目标平台必须和Python完全一致!比如你装的是64位Python,但C#项目设成了x86,那加载的Python runtime是32位的,自然找不到64位环境下装的Numpy。
检查方法:
- 打开Python控制台,输入
import sys; print(sys.maxsize > 2**32),返回True就是64位,False是32位。 - 在C#项目属性里,把“生成”选项卡的“平台目标”改成对应的位数(x64/x86)。
4. 包安装路径不在Python的搜索路径里
有时候你用pip install numpy是装在用户目录的site-packages里,而Python.Runtime调用的Python解释器没把这个路径加入搜索列表。可以在初始化后手动添加:
using (Py.GIL()) { // 把用户目录的site-packages路径加到sys.path dynamic sys = Py.Import("sys"); sys.path.Append(@"C:\Users\你的用户名\AppData\Roaming\Python\Python310\site-packages"); // 再导入numpy试试 dynamic numpy = Py.Import("numpy"); }
验证小技巧
先在命令行里运行where python,找到你装了Numpy的那个Python路径,然后在C#里把这个路径对应的目录设为PythonHome。同时在该路径下运行pip list,确认Numpy确实存在。
最后给你一个完整的测试代码示例:
using Python.Runtime; using System; class PythonCallTest { static void Main(string[] args) { // 替换为你的Python环境路径 string pythonHome = @"C:\ProgramData\Anaconda3"; PythonEngine.PythonHome = pythonHome; // 更新PATH string path = Environment.GetEnvironmentVariable("PATH"); Environment.SetEnvironmentVariable("PATH", $@"{pythonHome}\DLLs;{pythonHome}\Scripts;{path}"); // 初始化Python引擎 PythonEngine.Initialize(); try { using (Py.GIL()) { dynamic numpy = Py.Import("numpy"); Console.WriteLine($"成功加载Numpy,版本:{numpy.__version__}"); } } catch (PythonException ex) { Console.WriteLine($"调用出错:{ex.Message}"); } finally { PythonEngine.Shutdown(); } Console.ReadKey(); } }
内容的提问来源于stack exchange,提问作者user2910705

