PythonコードからC#で記述されたいくつかの.NETアセンブリにアクセスしたいと思います。
少し調べてみると、2つの選択肢があることがわかりました。
- .NETインターフェース機能/サポートが組み込まれたIronPython
- Python.NETパッケージを使用したPython
両方のソリューション間のトレードオフは何ですか?
PythonコードからC#で記述されたいくつかの.NETアセンブリにアクセスしたいと思います。
少し調べてみると、2つの選択肢があることがわかりました。
両方のソリューション間のトレードオフは何ですか?
主に.NETFrameworkに基づいてコードを作成する場合は、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インタープリターと安全に対話できるようにします。これに関する詳細は、WebサイトのPythonCAPIドキュメントを 参照して
www.python.orgください。管理対象アプリケーションにPythonを埋め込む場合は、CまたはC++アプリケーションにPythonを埋め込む場合とまったく同じ方法でGILを管理する必要があります。
名前空間によって提供されるオブジェクトまたはAPIと対話する前に
Python.Runtime、呼び出し元のコードは、メソッドを呼び出してPythonグローバルインタープリターロックを取得している必要がありますPythonEngine.AcquireLock。このルールの唯一の例外はPythonEngine.Initializeメソッドです。このメソッドは、GILを取得せずに起動時に呼び出すことができます。Python APIの使用が終了したら、マネージコードは対応するを呼び出し
PythonEngine.ReleaseLockてGILを解放し、他のスレッドがPythonを使用できるようにする必要があります。
AcquireLockおよびReleaseLockメソッドは、Python APIのアンマネージPyGILState_Ensureおよび 関数のシンラッパーでPyGILState_Releaseあり、これらの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のビルドはまだ提供されていません。」
IronpythonはC#に似ていますが、C#は動的言語であるのに対し、静的なビルド済みライブラリに依存しています。
CpythonはC++のようなもので、Ironpythonは動的言語であり、動的ライブラリにアクセスできます。動的ライブラリは、すべてを強制的に書き込むことになります。
Ironpythonは、特定の領域でC#より高速ですが、Cpythonより高速ではありません。ただし、Ironpythonを任意の言語にリンクできるため、問題が発生しますが、Cpythonでも同じことができます。
何を選んでも、面白くてシンプルでパワフルな言語!
IronPythonは基本的に統合された.netサポートを備えたPython2.7であり、おそらくPython 3をサポートすることはありません。CおよびPythonライブラリでは失われますが、ツイスト側では.netにアクセスでき、C#で拡張できます。したがって、すでにC#を使用している場合は、IronPythonがボーナスになります。
IronPythonはマネージコードとしてコンパイルされ、簡単に逆コンパイルできるため(私が最も嫌うもの)、私は主にPython for .NETを好みますが、py2exeまたはpyinstallerを使用すると、アンマネージアプリケーションとしてNETモジュールを使用してPythonをコンパイルできます。