1

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

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

我已经阅读并尝试过 IronPython 和 PythonNet,但只取得了有限的成功。由于 IronPython 实际上能够运行我的 python 脚本,因此它找不到导入。另一方面,Pythonnet 在 *** 中一直很痛苦,因为我似乎无法让它运行,既不是通过从 Nuget 安装,也不是通过 Anaconda 安装,也不是从源代码构建。我相信 pythonNet 将是实现这一目标的最佳选择,但无法让它工作,因为安装程序总是抱怨我的 .Net 版本,或者我使用 Python.Runtime 的单声道应用程序找不到正确的 python 安装。

我在带有 monodevelop/visual studio 代码的 Ubuntu 18.04 64 位机器上使用 Anaconda2(本地安装)。为了清楚起见,我实际上已经在两个 stackexchange 上寻找解决方案,如 pythonnet github 页面。

4

2 回答 2

0

我没有经常使用 *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. 编辑:正如史蒂夫所说,如果你想以交互方式使用它,你也可以使用套接字而不是标准输出

于 2018-05-25T20:35:38.303 回答
0

尽管上面的答案是我首先要寻找的,但我找到了另一种实现此目的的方法,并认为将其作为替代方法发布在这里是个好主意:可以使用流程中的 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 输出流时,该事件就会触发,并且可以在整个程序集中使用,从而导致它与进程本身失去耦合。

于 2018-06-24T14:03:02.877 回答