【C#】Pythonをプロジェクトに含めて実行する

スポンサーリンク

知っていましたか?
VisualStudio(開発言語:C#)上でのプロジェクトの中でPythonを含める事が出来ます。
今回は、『Pythonファイルをプロジェクトに含めて、Pythonを実行する方法』を紹介します。
Pythonファイルを実行する手段の1つとして紹介します。
※個人的な見解ですが、Pythonを開発したい場合は、VisualStudioCode、Jupiterなどのエディタがいいと思います。

パッケージ[IronPython]をインストール

[ツール]⇒[NuGetパッケージマネージャー]⇒[ソリューションのNugetパッケージ管理]

[Nugetソリューション]のタブが開くので、[参照]

検索にパッケージ名を入力し、対象のパッケージを選択する。[検索:ironpython]

下記、以降は[dynamicjson]の場合

パッケージをインストールするプロジェクトを選択し、[インストール]

確認が出てくるので[OK]

出力ウィンドウを確認する。
『正常にインストールされました』という文章が出力されています。

プロジェクトにpythonファイルを追加する

下記のようにプロジェクトにPythonファイルを追加する方法を紹介します。

新規でPythonファイルを追加する

プロジェクトを右クリックして、【追加】→【新しい項目】を選択してください。

【C#個の項目】→【テキストファイル】を選択する。
そして、名前の欄にファイル名を入力する。この時の拡張子は[.py]にすること
問題なければ追加をする。

問題なければ、プロジェクトにpyファイルが追加されている。

既存(作成済み)のPythonファイルを追加する

プロジェクトを右クリックして、【追加】→【既存の項目】をクリックする。

ファイルダイアログが開くので、作成したPythonファイルを選択する。
選択したら、【追加】をクリックする。

プロジェクトにPythonファイルが追加されていることを確認する。

Pythonを実行する

NameSpace

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

サンプル処理

サンプルのPythonファイルは、ココをクリックてください。

ScriptRuntime py = Python.CreateRuntime();

//ココで実行
Console.WriteLine("[Pythonファイル実行]");
dynamic script = py.UseFile("SamplePy.py");
Console.WriteLine(""); //区切り

//helloを実行する
Console.WriteLine("[Hello関数を実行する]");
string hoge = script.Hello("Taro");
Console.WriteLine("return:" + hoge);
Console.WriteLine(""); //区切り

//MyTestクラスのmyhelloを実行する
Console.WriteLine("[MyTestクラスを作成し、MyHello関数を実行する]");
dynamic myclass = script.MyTest();
string tmp = myclass.myHello("Hanako");
Console.WriteLine("return:" + tmp);
Console.WriteLine(""); //区切り

//これでもいいんじゃない?
Console.WriteLine("[この方法でも可能]");
string hello = script.MyTest().myHello("ichiro");
Console.WriteLine("return:" + hello);
Console.WriteLine(""); //区切り

ざっくりと解説すると、Pythonを実行するためのスクリプトクラスを作成する。

ScriptRuntime py = Python.CreateRuntime();

dynamic型でPythonファイルを読み込む。
Pythonファイルは、プロパティでビルドのたびに出力できるようにしておきます。
(プロパティの設定方法はココをクリック)

dynamic script = py.UseFile("SamplePy.py");

読み込んだPythonファイルの関数を実行する。

string hoge = script.Hello("Taro");

Pythonファイル内に定義されているクラスをdynamic型で読み込む。
読み込み後、クラス内の関数を実行する。

dynamic myclass = script.MyTest();
string tmp = myclass.myHello("Hanako");

もしくは、

string hello = script.MyTest().myHello("ichiro");

出力結果

[Pythonファイル実行]
サンプルPython実行
Creat MyTest

[Hello関数を実行する]
Hello_Function!!
return:HelloTaro

[MyTestクラスを作成し、MyHello関数を実行する]
MyTest.myHello_Function:Hanako
return:こんにちはHanako

[この方法でも可能]
MyTest.myHello_Function:ichiro
return:こんにちはichiro

実行される順番としては、
dynamic script = py.UseFile(“SamplePy.py”)
処理タイミングで、サンプルのPythonの①と③が実行される。
インスタンスが作られるものが実行されている事が分かる。

そして、読み込んだpython内の関数を実行していくことでprintされている事がわかる。

まとめ

C#でPythonファイルをプロジェクトに追加して実行する方法】を紹介しました。
『IronPython』を使う事で簡単に実行可能です。
気になる点としては、【初動は多少時間がかかる】という事です。
dynamic型なのかScriptRuntimeクラスなのか、必要なパッケージの読み込みなのかわかりませんが、メモリの確保に少し時間を要しているのだと推測します。
ただ2度目以降からは、気にならない速度で実行されていました。

dynamic型を使うととても簡単に実行できるので、C#をメインにPythonをサブに動作させる構成の場合はとても良いと思います。

補足

サンプルのPythonファイル

4つのprint関数を作っている。
ファイルを実行された時(「サンプルPython実行」と表示)
ファイル内の関数を実行された時(「Hello Function!!」と表示)
ファイル内の定義されたクラスが実行された時(「Create MyTest」を表示)
ファイル内の定義されたクラス内の関数が実行された時(「MyTest.myHello Function:(引数)」を表示)

print("サンプルPython実行")

def Hello(name):
	print('Hello_Function!!')
	return "Hello" + name

class MyTest:
	print('Creat MyTest')
	def myHello(self,name):
		print('MyTest.myHello_Function:' + name)
		return "こんにちは" + name

サンプルのPythonファイルも出力する

dynamic script = py.UseFile("SamplePy.py");

引数がファイル名のみ場合、exeの階層にPythonファイルがある事が前提になります。
※記憶が正しければ、もしくはProgramFilesだったような。。。。
その為、プロジェクトに含めたPythonファイルをExeの階層に置く必要があります。
プロパティを変更する事でビルドのタイミングでファイルを出力する設定があります。
下記のように、出力ディレクトリコピーを【常にコピーする】にしてください。

コメント

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