有谁知道在 .Net 或 Mono 应用程序中集成 python(anaconda 和 anaconda 模块)的直接方法?

Does anyone know a straight-forward way of integrating python (anaconda with anaconda modules) in a .Net or Mono application?

几天来我一直在为此苦苦挣扎,似乎无法找到实现这一目标的直接方法。我对 .Net 和 Mono 没有太多经验,但足以构建应用程序。

我遇到的问题是我想编写一个 c# 应用程序,并且 运行 python 在后台处理。这些 python 进程也有导入,因此我需要能够在它们的 anaconda 环境中 运行 它们。

我已经阅读并试验过 IronPython 和 PythonNet,但收效甚微。由于 IronPython 实际上能够 运行ning 我的 python 脚本,它找不到导入。另一方面,Pythonnet 一直是一个痛苦的问题,因为我似乎无法获得它 运行ning,无论是从 Nuget 还是 Anaconda 安装,也不是从源代码构建。我相信 pythonNet 最适合实现这一点,但一直无法让它工作,因为设置总是抱怨我的 .Net 版本,或者我使用 Python.Runtime 的单声道应用程序找不到合适的python安装。

我在 Ubuntu 18.04 64 位机器上使用 Anaconda2(本地安装),使用 monodevelop/visual 工作室代码。需要明确的是,我实际上已经在两个 stackexchange 上寻找解决方案,如 pythonnet github 页面。

我没有经常使用 *conda,但我有两个想法:

  1. 编写您的 python 程序,只需使用一些参数启动它们并等待它们的结果:

    string progToRun = "C:\Dev\hello.py";
    int param1 = 42; float param2 = 0.25f;
    
    Process proc = new Process();
    proc.StartInfo.FileName = "python.exe";
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.Arguments = string.Concat(progToRun, " ", param1.ToString(), " ", param2.ToString());
    proc.Start();
    
    StreamReader sReader = proc.StandardOutput;
    string[] output = sReader.ReadToEnd().Split({'\r'});
    
    foreach (string s in output)
        Console.WriteLine(s);
    
    proc.WaitForExit();
    
  2. 微软有新的ML.NET机器学习框架,你可以看看

  3. 编辑:正如所说,如果您想交互使用套接字,您也可以使用套接字代替标准输出

虽然上面的答案正是我最初想要的,但我找到了另一种方法来实现这一点,并认为将其作为替代方法 post 是个好主意: 可以使用进程 class 中的 OutputDataReceived 事件并让它调用一个方法。这样,每次 python 进程向其控制台或标准输出输出内容时,您都可以触发多个方法。 用法:

proc.OutputDataReceived += OnOutputDataReceived

OnOutputDataReceived 是一种带有事件处理程序签名的方法,因此采用发送者和 EventArgs 参数。您可以添加多个方法,或使用自定义 EventArgs 对象在 OnOutputDataReceived 方法中引发另一个事件,并以多种方式处理流程的输出。即记录器。

private void OnOutputDataReceived(sender e, EventArgs args) 
{
    Console.WriteLine(args.Data);
    using(Logger){
        Logger.log("python output: "+args.Data);
    }
}

只要有内容写入 python 输出流,事件就会触发,并且可以在整个程序集中使用,导致它与进程本身松散耦合。