Python for .NET の「Python for .NET」のほう、「.NET for Python」でなくて (未遂)

不案内、ひじょーに。

ワタシの紹介も含め、情報は一方的に「.NET for Python としての pythonnet」使いに偏っている。

「Python を .NET に埋め込みたい」向きにも IronPython が競合他社となるわけだが、これもやっぱし「公式 CPython を使わなければならない理由」に基いてどっちがいいか決めればいいだろう、て前置きは予めしとく。つまりどう考えてもアレっすよ、「NumPy/SciPy を苦もなく使いたい」かどうかさ、たとえば。

でその「Embedding Python in .NET」だが、いや、これじゃわからんてば:

プロジェクトにどんな設定が必要か、具体的には参照アッセンブリとして何を追加すればいいのか、がなんにも書いてない。せめてアッセンブリの DLL の名前くらい書けよ…。

一時間以上徘徊してようやくわかった。まずはこれ:

これが「答えの一部その壱」。「アッセンブリの名前と場所」。

「Python から pythonnet で Excel へのアクセス」の話で GAC の説明を一応したが、pythonnet は「.NET for Python」として使われる場合に、アッセンブリの検索時「Python モジュールの検索パス」も含める。つまり Python 2.7 ならばたとえば「c:/Python27/Lib/site-packages」(を含む環境変数 PYTHONPATH (等)が指定する場所)。なので:

Python からの Python for .NET 使いとしては意味はない例。アッセンブリ検索の振る舞いを確認してるだけ。
1 Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
2 Type "help", "copyright", "credits" or "license" for more information.
3 >>> import clr
4 >>> clr.AddReference("Python.Runtime")
5 <System.Reflection.RuntimeAssembly object at 0x0000000002AFC518>
6 >>> clr.Python.Runtime.PythonEngine
7 <class 'Python.Runtime.PythonEngine'>

と「Python からは」使えるが、「Python for .NET」として使いたい場合は、この「c:/Python27/Lib/site-packages にいる」という情報を明示的に与える必要がある、てわけだわね。

さぁあとは公式サイト説明を真似るだけだ、であれば良かったんだけど、そこさえも肝心なことが書かれてない。

この不正解が正解に限りなく近いと信じている。ノリは CPython の CPython C API を使うのとだいたい同じ感じなのかな、という印象。無論ダルかろうが、まぁそんなもんだ。

まだ試みてないが、このあと試みてみる。これに近いノリのをやってみたい。

続く…。