ブログ

割とコンピュータよりの情報をお届けします。

2019年2月10日

C#からPythonの関数を呼び出し

C言語からPythonの関数呼び出し4」から発展を考えていたら,C#から呼び出しの記事を書いていないことに気が付いたので備忘録も含めて記載する.
なお,参考は「Pythonから.NETを呼び出す方法とついでにその逆も(https://qiita.com/y-tsutsu/items/0c4561d6478be32e6f8e)」なのだ.

使用するのはPython for .NETである.これ自体は前にも扱っている.このときには,Pythonから.NETを呼び出すというのをやっていた.
今回はその逆である.

git clone https://github.com/pythonnet/pythonnet.git

でgithubからpythonnetをダウンロードする.
ダウンロードされたフォルダの中にpythonnet.slnファイルがあるはずなのでこれを開く(Visual Studio 2017).

その後,ビルドの構成はReleaseWinPY3でx64(実際には実行環境に合わせる)でビルドする.するとbinフォルダにPython.Runtime.dllが出来上がる.

次に,.NETのプロジェクトを作る.
この時,アッセンブリの参照に先のPython.Runtime.dllを加えてやる(これが大事).参考のページではNugetパッケージをとってきているが,Python 3.7もPython for .NETもGitHubの方の更新が速いのでこのNugetパッケージは更新が全く追い付いていない.

続いて,「Pythonから.NETを呼び出す方法とついでにその逆も」からサンプルコードを頂く.
例えば以下のようなコードになる.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Python.Runtime;

namespace TEST
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Py.GIL())
            {
                dynamic np = Py.Import("numpy");
                dynamic a = np.array(new List<double> { 1.0, 2.1, 3.2 });
                Console.WriteLine(a.dtype);
                dynamic b = np.array(new List<float> { 4, 5, 6 }, dtype: np.int32);
                Console.WriteLine(b.dtype);
                Console.WriteLine(a * b);
                Console.ReadKey();
            }
        }
    }
}

実行時には,NumpyをインストールしたPython Embeddableのフォルダの場所にexeファイルとdllファイル突っ込めば実行できる.(Visual Studioのデバッグの際にはプロジェクトのプロパティで「デバッグ」の設定で,同等の構成になるように作業フォルダなどを調整する)

≫ 続きを読む

2019/02/10 コンピュータ   TakeMe
タグ:Python