You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET/Mono应用中集成带Anaconda模块的Python?

我明白你折腾了好几天的痛苦——在Ubuntu 18.04用Mono写C#调用Anaconda环境的Python脚本,还得带依赖,确实踩坑不少。我给你两个可行的方案,一个是直接启动Anaconda Python进程(最省心的简便方法),另一个是搞定PythonNet的配置问题,你可以按需选:

方案一:直接调用Anaconda Python可执行文件(推荐,无版本兼容烦恼)

这个方法绕开了IronPython和PythonNet的兼容性问题,直接通过系统进程启动Anaconda环境里的Python,完全复用你Anaconda环境的所有依赖包,步骤很简单:

  1. 找到你的Anaconda Python路径:

    • 如果是base环境,路径一般是 ~/anaconda2/bin/python
    • 如果是自定义环境,比如名为my_env的环境,路径是 ~/anaconda2/envs/my_env/bin/python
      你可以在终端里用which python(激活环境后)确认准确路径。
  2. 在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);
                }
            }
        }
    }
    
  3. 测试验证:
    先在终端里激活你的Anaconda环境,手动运行python your_script.py,确保脚本能正常导入依赖包并执行,再放到C#代码里运行。

方案二:修复PythonNet的配置问题

如果你坚持要用PythonNet,那得解决版本兼容和路径配置的问题,针对你的Ubuntu 18.04 + Anaconda2 + Mono环境,按以下步骤来:

  1. 安装匹配版本的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版本)兼容性更好。

  2. 在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();
            }
        }
    }
    
  3. 编译运行注意事项:

    • 编译时要引用PythonNet的程序集,它在Anaconda环境的lib/python2.7/site-packages/Python.Runtime.dll路径下,把这个dll复制到你的C#项目里添加引用。
    • 运行前确保Anaconda的环境变量已经正确设置,或者在终端里先激活Anaconda环境再运行你的C#程序。

内容的提问来源于stack exchange,提问作者Glenn van Acker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:54:22