Кто-нибудь знает простой способ интеграции python (anaconda с модулями anaconda) в приложения .Net или Mono? - PullRequest
0 голосов
/ 25 мая 2018

Я боролся с этим в течение нескольких дней, и, похоже, не могу найти простой способ добиться этого.У меня нет большого опыта работы с .Net и Mono, но достаточно для создания приложения.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу написать приложение ac # и запустить процессы pythonна заднем фоне.Эти процессы Python также имеют импорт, и поэтому мне нужно иметь возможность запускать их в их среде anaconda.

Я читал и экспериментировал с IronPython и PythonNet, но добился лишь ограниченного успеха.Поскольку IronPython на самом деле способен запускать мои скрипты на python, он не может найти импорт.С другой стороны, Pythonnet был проблемой в ***, так как я не могу запустить его ни из-за установки из Nuget, ни из Anaconda, ни из сборки из исходного кода.Я полагаю, что pythonNet был бы лучшим для достижения этой цели, но не смог заставить его работать, так как программа установки всегда жалуется на мою версию .Net или мое моно-приложение, использующее Python.Runtime, не может найти правильную установку Python.

Я использую Anaconda2 (локальная установка) на 64-битной машине Ubuntu 18.04 с monodevelop / visual studio code.Просто чтобы прояснить ситуацию, я на самом деле искал решения для обоих стековых обменов, как на страницах pythonnet github.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Несмотря на то, что приведенный выше ответ - это то, что я искал в первую очередь, я нашел другой способ добиться этого и подумал, что было бы неплохо опубликовать его здесь в качестве альтернативного способа: возможно использовать событие OutputDataReceived.из класса процесса, и пусть он вызывает метод.Таким образом, вы можете запускать несколько методов каждый раз, когда процесс python выводит что-то на консоль или стандартный вывод.использование:

proc.OutputDataReceived += OnOutputDataReceived

OnOutputDataReceived - это метод с сигнатурой обработчика событий, который принимает параметр sender и EventArgs.Вы можете добавить несколько методов или вызвать другое событие в методе OnOutputDataReceived с помощью пользовательского объекта EventArgs и обрабатывать выходные данные процесса несколькими способами.т. е. регистратор.

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

событие будет вызываться всякий раз, когда что-то записывается в выходной поток python, и может использоваться во всей сборке, что приводит к потере связи с самим процессом.

0 голосов
/ 25 мая 2018

Я не так много работал с * 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 система машинного обучения от Microsoft, поэтому вы можете проверить ее

  3. изменить: как сказал Стив , вместо стандартного вывода вы можете использовать также сокеты, если вы хотите использовать его в интерактивном режиме

...