PythonコードからC#で記述されたいくつかの.NETアセンブリにアクセスしたいと思います。
少し調べてみると、2つの選択肢があることがわかりました。
- .NETインターフェース機能/サポートが組み込まれたIronPython
- Python.NETパッケージを使用したPython
両方のソリューション間のトレードオフは何ですか?
PythonコードからC#で記述されたいくつかの.NETアセンブリにアクセスしたいと思います。
少し調べてみると、2つの選択肢があることがわかりました。
両方のソリューション間のトレードオフは何ですか?
回答:
主に.NETフレームワークに基づいてコードを作成する場合は、IronPythonとPython.NETを強くお勧めします。IronPythonはほとんどネイティブの.NETであるため、他の.NET言語と統合するときにうまく機能します。
Python.NETは、.NETの1つまたは2つのコンポーネントを標準のPythonアプリケーションに統合する場合に適しています。
IronPythonを使用する場合、顕著な違いがありますが、それらのほとんどはかなり微妙です。Python.NETは標準のCPythonランタイムを使用するため、このWikiページは2つの実装の違いについての関連する議論です。最大の違いは例外のコストで発生します-そのため、標準のPythonライブラリの一部は、実装のためにIronPythonではうまく機能しません。
ReedCopseyとAlexMartelliの回答に同意する一方で、もう1つの違いであるGlobal Interpreter Lock(GIL)を指摘したいと思います。IronPythonにはGILの制限はありませんが、CPythonには制限があります。そのため、GILがボトルネックになっているアプリケーション、たとえば特定のマルチコアシナリオでは、IronPythonはPython.NETよりも優れているように見えます。
Python.NETドキュメントから:
エンベダーに関する重要な注意事項: Pythonはフリースレッドではなく、グローバルインタープリターロックを使用して、マルチスレッドアプリケーションがPythonインタープリターと安全に対話できるようにします。これに関する詳細は、
www.python.org
WebサイトのPython CAPIドキュメントで入手できます 。管理対象アプリケーションにPythonを埋め込む場合は、CまたはC ++アプリケーションにPythonを埋め込む場合とまったく同じ方法でGILを管理する必要があります。
Python.Runtime
名前空間によって提供されるオブジェクトまたはAPIと対話する前に 、呼び出し元のコードは、PythonEngine.AcquireLock
メソッドを呼び出してPythonグローバルインタープリターロックを取得している必要があります 。このルールの唯一の例外はPythonEngine.Initialize
メソッドです。この メソッドは、GILを取得せずに起動時に呼び出すことができます。Python APIの使用が終了したら、マネージコードは対応する
PythonEngine.ReleaseLock
を呼び出してGILを解放し、他のスレッドがPythonを使用できるようにする必要があります 。
AcquireLock
およびReleaseLock
方法は、アンマネージ上に薄いラッパーですPyGILState_Ensure
し、PyGILState_Release
PythonのAPIからの機能、およびこれらのAPIのドキュメントは、管理対象のバージョンに適用されます。
もう1つの問題はIDEのサポートです。CPythonはおそらく現在IronPythonよりも優れたIDEサポートを備えているため、これがどちらかを選択する際の要因となる可能性があります。
CPython C-APIに依存する科学的および数値的なPythonライブラリのほとんど(numpy、scipy、matplotlib、pandas、cythonなど)は主にCPythonで動作するため、その場合の最善の策はpythonnet(他の名前-Python.NET)です。およびPythonfor .NET)。同じことがWxWidgets、PyQt / PySide、GTK、KivyなどのCPython GUIバインディングにも当てはまりますが、pythonnetとIronPythonの両方でWPFとWinFormsを使用できます。
そして最後に、IronPythonはまだPython3を完全にはサポートしていません。
IronPythonは「.NETネイティブ」であるため、Pythonコードを.NETと完全に統合する場合に適しています。Python.NETはクラシックPythonで動作するため、Pythonコードの「独立企業間原則」を.NETから適切に遠ざけることができます。(このコードを使用すると、IronPythonコードからCPython用に記述された拡張機能を実際に使用できるため、これはもはや識別条件ではないことに注意してください)。
IronPythonはMicrosoftから提供されているので、他のMSFTテクノロジでより適切に動作すると想定する必要があるため、最初にそれを使用します。
2016年も。
私の会社ではIronPythonを使用しましたが、パフォーマンスに満足できなかったため(ほとんどの場合、メモリの使用-ガベージコレクターが遅すぎました)、標準のPythonに切り替えて、Zeroce-sICEを使用して.Netと統合することにしました。
IronPythonは現在、Python 3.6をサポートしていません(2.7のみ)
IronPython3 から「IronPython3のビルドはまだ提供されていません。」