web-dev-qa-db-ja.com

Pythonコードをc#コードと統合するにはどうすればよいですか?

コードpython(階層的クラスタリングアルゴリズム))をコードC#と統合したい。

(プロジェクトのアイデアは、類似した人々を分割し、アルゴリズムを使用してそれらをクラスに入れることです。私たちは言語c#(asp.net)を使用し、アルゴリズムをコードにリンクするメソッドが必要です。)

1
Mostafa khaled

これで完了です。マイクロサービスアーキテクチャを使用することをお勧めします。コードは、Python Rest Serviceを呼び出してデータを計算し、結果を返します。または、操作が長い場合(ほとんどの場合、クラスタリング)、2つのサービス間のブローカーとしてメッセージキューを使用します。

ライブラリを使用して、直接python C#からのコード http://pythonnet.github.io/ を呼び出すことができます。正常に機能すると、驚くほど適切に機能します。そうでなければ、あなたは傷ついた世界にいます-最も特にそれは時々ロードに失敗します(少なくとも決定論ですが、診断するのは楽しいです)さらに、python GILにより、1つに制限されますPythonプロセス。また、PythonとC#の間のデータのマーシャリングは簡単ではなく、興味深いデバッグセッションにつながります。たとえば、PythonでIENumerableの内部に突入しようとすると...

全体として、マイクロサービスパターンは、構築、推論、デバッグ、および構築が容易です。唯一の欠点は、2つまたは3つの可動部品があり、取引ブレーカーになる可能性があることです。

8
Christian Sauer

この記事は洞察に富んでいる可能性があります: https://code.msdn.Microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee

基本的には、pythonスクリプトを記述し、コマンドライン引数を使用して戻り値を出力するスクリプトを記述します。C#コードは、必要な引数を使用してこのスクリプトを呼び出し、そこから値を取得します。

using System; 
using System.IO; 
using System.Diagnostics; 

namespace CallPython 
{ 
    /// <summary> 
    /// Used to show simple C# and Python interprocess communication 
    /// Author      : Ozcan ILIKHAN 
    /// Created     : 02/26/2015 
    /// Last Update : 04/30/2015 
    /// </summary> 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            // full path of python interpreter 
            string python = @"C:\Continuum\Anaconda\python.exe"; 

            // python app to call 
            string myPythonApp = "sum.py"; 

            // dummy parameters to send Python script 
            int x = 2; 
            int y = 5; 

            // Create new process start info 
            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(python); 

            // make sure we can read the output from stdout 
            myProcessStartInfo.UseShellExecute = false; 
            myProcessStartInfo.RedirectStandardOutput = true; 

            // start python app with 3 arguments  
            // 1st arguments is pointer to itself,  
            // 2nd and 3rd are actual arguments we want to send 
            myProcessStartInfo.Arguments = myPythonApp + " " + x + " " + y; 

            Process myProcess = new Process(); 
            // assign start information to the process 
            myProcess.StartInfo = myProcessStartInfo; 

            Console.WriteLine("Calling Python script with arguments {0} and {1}", x,y); 
            // start the process 
            myProcess.Start(); 

            // Read the standard output of the app we called.  
            // in order to avoid deadlock we will read output first 
            // and then wait for process terminate: 
            StreamReader myStreamReader = myProcess.StandardOutput; 
            string myString = myStreamReader.ReadLine(); 

            /*if you need to read multiple lines, you might use: 
                string myString = myStreamReader.ReadToEnd() */           

            // wait exit signal from the app we called and then close it. 
            myProcess.WaitForExit(); 
            myProcess.Close(); 

            // write the output we got from python app 
            Console.WriteLine("Value received from script: " + myString); 

        } 
    } 
} 
1
John Go-Soco