【 C# / Python 】C#から Pythonを実行(IronPython3)

C#

■ 主の PC環境一覧

OS:Windows11
CPU:Intel® Core™ i9 13900KF
Memory:64GB
GPU:NVIDIA® GeForce RTX™ 3070 8GB

IDE:Visual Studio 2022
IronPython 3.4.0

■ IronPython とは?


IronPythonは、Pythonプログラミング言語の実行環境であり、Microsoftの.NET Framework上で動作します。
IronPythonは、Pythonの柔軟性とシンプルさを備えながら、強力な.NET Frameworkの機能と統合開発環境の恩恵も受けることができます。

「IronPython」と「IronPython3」の違いは、バージョンの違いです。

IronPython

IronPythonは、Python 2.x系列のバージョンと互換性を持ちます。

IronPython3

IronPython3は、Python 3.x系列のバージョンと互換性を持ち、最新の言語機能や改善されたパフォーマンスを提供します。

■ 本記事の対象者

  • 処理的には Pythonで開発をする方が勝手が良いけどユーザビリティも高めたい!
  • Pythonのライブラリー「Tkinter」で GUIを作りこむのは億劫、、
  • C#(.NET Framework)フォームアプリケーションで GUIを作る方が楽だ!

と、上記で記載したものの本記事の閲覧者は応用力が高い方ばかりと認識しているので、サクッと C#から Pythonを呼び出すためにコンソール出力でサンプルプログラムを書きますことご了承ください。


■ 準備

[1] コンソールアプリ(.NET Framework)作成

[2] Nugetパッケージマネージャーより「IronPython 3.4.0」をインストール

[3] C#から Pythonを呼び出す実装

【 忘れない 】

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
C#プログラムの全体
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;


namespace SamplePythonModule
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Pythonモジュールの呼び出し
            ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();

            // Pythonスクリプトの読み込み(引数に対象の Pythonファイル名を指定)
            ScriptSource source = engine.CreateScriptSourceFromFile("test.py");
            source.Execute(scope);



            // Pythonモジュール内のメソッド呼び出し(globalに定義されたメソッド)
            dynamic globalModule = scope.GetVariable("gobal_method");
            dynamic result = globalModule();

            // 結果の表示
            Console.WriteLine(result);



            // Pythonモジュール内のクラスのインスタンス化及びインスタンスメソッド呼び出し
            dynamic testClass = scope.GetVariable("TestClass");                    // 引数:Pythonモジュール内の"クラス名"を指定
            dynamic instance = testClass("コンストラクタの引数です");                // 引数:上記で指定したクラスのコンストラクタに渡す引数の値
            string instanceResult = instance.instance_method("関数の引数です");     // 引数:呼び出すインスタンスメソッドの引数の値

            // 結果の表示
            Console.WriteLine(instanceResult);
        }
    }
}
Pythonプログラムの全体

Pythonプログラムの配置場所

SamplePythonModule
├ bin
│ └ Debug
│   └ test.py
└ program.cs

def gobal_method():
    return "call:Fgobal_method"


class TestClass:
    def __init__(self, variable):
        self.instanceVariable = variable
    
    def instance_method(self, variable):
        return f"call:Fclass_method(instanceVariable = {self.instanceVariable}, variable = {variable})"
出力結果
call:Fgobal_method
call:Fclass_method(instanceVariable = コンストラクタの引数です, variable = 関数の引数です)

■ 最後に

特になし!

comment 📝

タイトルとURLをコピーしました