如何在.NET/Mono应用中集成带Anaconda模块的Python?
我明白你折腾了好几天的痛苦——在Ubuntu 18.04用Mono写C#调用Anaconda环境的Python脚本,还得带依赖,确实踩坑不少。我给你两个可行的方案,一个是直接启动Anaconda Python进程(最省心的简便方法),另一个是搞定PythonNet的配置问题,你可以按需选:
这个方法绕开了IronPython和PythonNet的兼容性问题,直接通过系统进程启动Anaconda环境里的Python,完全复用你Anaconda环境的所有依赖包,步骤很简单:
找到你的Anaconda Python路径:
- 如果是base环境,路径一般是
~/anaconda2/bin/python - 如果是自定义环境,比如名为
my_env的环境,路径是~/anaconda2/envs/my_env/bin/python
你可以在终端里用which python(激活环境后)确认准确路径。
- 如果是base环境,路径一般是
在C#中用
Process类启动进程:
直接调用这个Python可执行文件,指定你的脚本路径,同时可以捕获输出和错误信息。示例代码如下:using System; using System.Diagnostics; class PythonProcessRunner { static void Main(string[] args) { // 替换成你的Anaconda Python路径和脚本路径 string pythonPath = "/home/your_user/anaconda2/bin/python"; string scriptPath = "/path/to/your/python/script.py"; var processStartInfo = new ProcessStartInfo { FileName = pythonPath, Arguments = scriptPath, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, // 后台运行,不弹出终端窗口 WorkingDirectory = System.IO.Path.GetDirectoryName(scriptPath) // 设置脚本所在目录为工作目录 }; using (var process = Process.Start(processStartInfo)) { string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); Console.WriteLine("脚本输出:"); Console.WriteLine(output); if (!string.IsNullOrEmpty(error)) { Console.WriteLine("错误信息:"); Console.WriteLine(error); } } } }测试验证:
先在终端里激活你的Anaconda环境,手动运行python your_script.py,确保脚本能正常导入依赖包并执行,再放到C#代码里运行。
如果你坚持要用PythonNet,那得解决版本兼容和路径配置的问题,针对你的Ubuntu 18.04 + Anaconda2 + Mono环境,按以下步骤来:
安装匹配版本的PythonNet:
不要用NuGet安装,而是直接在你的Anaconda环境里安装,这样能保证版本匹配:# 先激活你的Anaconda环境 source activate base # 或者你的自定义环境名 # 用conda安装pythonnet conda install -c conda-forge pythonnet=2.5.2选择2.5.2版本是因为它对Mono 5.x/6.x(Ubuntu 18.04默认的Mono版本)兼容性更好。
在C#代码中配置Python路径:
初始化PythonEngine之前,必须指定Anaconda环境的路径,并且设置正确的环境变量,示例代码:using System; using Python.Runtime; class PythonNetRunner { static void Main(string[] args) { // 替换成你的Anaconda环境根目录 string anacondaHome = "/home/your_user/anaconda2"; // 设置PythonHome为Anaconda环境路径 Environment.SetEnvironmentVariable("PYTHONHOME", anacondaHome); // 设置LD_LIBRARY_PATH,确保Mono能找到Anaconda的库文件 Environment.SetEnvironmentVariable("LD_LIBRARY_PATH", $"{anacondaHome}/lib:{Environment.GetEnvironmentVariable("LD_LIBRARY_PATH")}"); // 设置PythonPath,包含Anaconda的site-packages Environment.SetEnvironmentVariable("PYTHONPATH", $"{anacondaHome}/lib/python2.7/site-packages"); // 初始化PythonEngine PythonEngine.Initialize(); try { // 执行你的Python代码或导入脚本 using (Py.GIL()) { // 示例:导入你的脚本并调用函数 dynamic module = Py.Import("your_script"); module.your_function(); // 替换成你脚本里的函数名 // 或者直接执行代码 PythonEngine.RunString("import numpy; print(numpy.__version__)"); } } catch (Exception ex) { Console.WriteLine($"执行出错:{ex.Message}"); } finally { PythonEngine.Shutdown(); } } }编译运行注意事项:
- 编译时要引用PythonNet的程序集,它在Anaconda环境的
lib/python2.7/site-packages/Python.Runtime.dll路径下,把这个dll复制到你的C#项目里添加引用。 - 运行前确保Anaconda的环境变量已经正确设置,或者在终端里先激活Anaconda环境再运行你的C#程序。
- 编译时要引用PythonNet的程序集,它在Anaconda环境的
内容的提问来源于stack exchange,提问作者Glenn van Acker

