c# - 連携 - vscode ブレークポイント 止まらない python




Pythonをインストールせずに.NET環境でPythonコードを実行する (4)

.NETからPythonコードをいくつか実行する必要があり、そのアプリケーションにPythonを同梱したくない場合は、 https://cython.org/ ようなものを使用して、PythonコードをEXEにコンパイルして https://cython.org/

Pythonからコンソールに書き込み、.NETから生成したプロセスの出力を取得することで、コマンドラインで変数に変数を渡し、Python関数から回答を受け取ることができます。 この方法では、他のSubやFunctionを呼び出すのと同じように機能します。唯一の違いは、各プロシージャが.NETへの新しいプロセスであることです。 複雑なオブジェクトをテキストとしてコンポーネント間で移動するときに展開したりラップしたりする必要があるため、複雑なオブジェクトをやり取りしたい場合、これは非常に複雑になる可能性があります。

結局のところ、あなたはあなたのPythonコードを.NETで書き直すだけで、まったくこの道をたどらないほうがよいでしょう。 https://github.com/uxmal/pytocs などのコンバーターツールを使用して、すべてのPythonコードをC#に変換します。 それはおそらく完璧ではないでしょうが、それはあなたが使いたいPython関数を置き換えることに取り組むためのコードベースをあなたに与えるでしょう。 言語とそれらの間の相互運用機能の両方を維持しようとするよりも、翻訳されたプロシージャをクリーンアップするのにかかる時間が短くなります。

Pythonをインストールしたり、PythonコードをC#に変換したりすることなく、.NET / C#環境でPythonコードを生成することは可能ですか。つまり、コードをそのままデプロイするだけですか?

私はPython言語をインストールするのが合理的なことであることを知っていますが、私は十分なマンパワーを持っていないので、私は本番環境に新しい言語を導入してそのテストとメンテナンスの複雑さに対処したくないPythonを知っている人は、これらの問題に注意を払う必要があります。

私はIronPythonがCLR上に構築されていることを知っていますが、それが.NET内でどのように正確にホストされ、維持されることができるのか知りません。 実際にPythonをスタンドアロン言語としてインストールしなくても、PYthonコードをC#コードにインポートできる「パッケージ」として扱うことができますか。 このような状況で、IronPythonはどのように私の生活を楽にすることができますか? python.netは私にもっとレバレッジを与えることができますか?


IronPythonは、.NET DLRではなくPythonインタプリタを必要とするCベースのライブラリでPythonを実行するのに比べて制限があります。 私はそれがあなたがPythonコードをどのように使っているかに依存すると思います、もしあなたがたくさんのサードパーティのpythonライブラリを使いたいのであれば、IronPythonがあなたのニーズに合うかどうか疑問です。

完全なPythonアプリケーションを構築してDockerからすべて実行するのはどうですか。

そのためにはDockerをインストールする必要がありますが、Dockerを使用して.NETアプリケーションをデプロイすることもできます。それらはすべて分離されていて、「環境」を汚すことはありません。

特にPythonおよび.NETプロジェクトの構築用および実行用の基本Dockerイメージがあります。


私がコメントで述べたように、それをするための正しいそしてより良い方法はあなたの Python コードの上にRestfulサービスを作成しそして C# コードからhttpリクエストをすることです。 私はあなたがPythonのウェブフレームワークについてどれほど知っているかわかりませんが、あなたが使用できるものはたくさんあります。 あなたの必要性のために、私はRestfulウェブサービスを作成するために軽量のマイクロウェブフレームワークである Flask を提案するでしょう。

これは例のための非常に単純なFlaskウェブサービスです:(あなたは here でそれの実行中のバージョンをチェックすることができ here 、私はそれをpythonOnEverywhereでホストしました)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello from Flask!'

@app.route('/math/add/<int:num1>/<int:num2>')
def add(num1, num2):
    return '%d' % (num1+num2)

この単純なサービスは、2つの数を加えてそれらの合計を返します。

そして C# コード:

using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

public class Program
{
    // Always use HttpClient as a singleton object
    public static HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("http://al1b.pythonanywhere.com") } ;
    public async static Task Main()
    {

        var num1 = 1;
        var num2 = 4;

        Console.WriteLine("Making http-request wait ...\r\n");      

        var mathAddResult = await _httpClient.GetAsync($"/math/add/{num1}/{num2}");

        // 200 = OK
        if(mathAddResult.StatusCode == HttpStatusCode.OK)
        {   
            Console.WriteLine(await mathAddResult.Content.ReadAsStringAsync());
        }
    }
}

出力:

Making http-request wait ... 

5

上記のコードの実行中のバージョンは、 現在.NET Fiddleで実行可能 です。

TL; DR:

Flaskを理解し学習するためには、その documentions 見てください。 (それは短くて元気です)。 Webサービスの入力として複雑なオブジェクトやpoccoオブジェクトを受け入れたり、Webサービスの結果として複雑なオブジェクトを(jsonとして)返したりするなど、複雑なWebサービスを使用することになるでしょう。

その場合は、Flask jsonify がどのように機能するのかを知っておく必要があり how 。このリンクは how を教えてくれ how

一方、C#アプリケーションには、複雑なオブジェクトやシナリオもあります。 シリアル化、デシリアゼ化などの方法を知る必要があります。

マイクロソフトはここでそのチュートリアルのために素晴らしい仕事をしました:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

そして

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8


私はその質問を本当に理解していません。 あなたはpythonをインストールしたくない、それはあなたのシステムにそれを導入したくない、なぜならそれは追加の維持費があり、あなたのチームはそれについての基本的な知識を欠いているから。 それでも、あなたは誰にも知られずにそれを「生産」したいのです。

私はあなたがスクリプト言語を使いたいと思い、そして何らかの理由であなたはpythonを選択したと思います。 私の答えはこの仮定に基づいています。

IronPythonが、私たちが dynamic キーワードとDLRを.netの世界に持っている理由です。 あなたはそれをあなたのアプリケーションとしてホストすることができ、そしてそれにいくつかのpythonコードを.net互換型にコンパイルさせることができます。

IronPython自身のドキュメントがそれを言及してい https://ironpython.net/documentation/dotnet/dotnet.html#accessing-python-code-from-other-net-code

その方法を示すMSDNブログ投稿もあります。 https://blogs.msdn.microsoft.com/seshadripv/2008/06/30/how-to-invoke-a-ironpython-function-from-c-using-the-dlr-hosting-api/

それが役に立てば幸い







python.net