CPython と IronPython の両方から使用されるモジュールを作成する必要があります。その場合は少し異なる動作が必要なので、IronPython を検出する最良の方法は何ですか?
sys.platform は CPython では「win32」ですが、IronPython では「cli」であることに気付きました。
それを検出する別の優先/標準的な方法はありますか?
CPython と IronPython の両方から使用されるモジュールを作成する必要があります。その場合は少し異なる動作が必要なので、IronPython を検出する最良の方法は何ですか?
sys.platform は CPython では「win32」ですが、IronPython では「cli」であることに気付きました。
それを検出する別の優先/標準的な方法はありますか?
Python 2.6 の新機能は次のplatform.python_implementation
とおりです。
Python 実装を識別する文字列を返します。可能な戻り値は、'CPython'、'IronPython'、'Jython' です。
これがおそらく最もクリーンな方法であり、標準的な方法です。ただし、Jython はまだ 2.5 を実行していると思いますので、これを信頼して Jython を検出できるかどうかはまだわかりません (ただし、それは質問の一部ではありませんでした)。
次のコードは、CPython 2.6 および Iron Python 2.6 (.NET 2.0) で動作します。ただし、Iron Python 2.6 (.NET 4.0) では動作しません。バージョン番号を解析する platform.py に問題があります。Python.org に欠陥を提出しました。platform.py の修正はそれほど難しくありません。
import sys
import platform
def IsIronPython():
return platform.python_implementation().lower().find("ironpython")!=-1
print IsIronPython()
理想的には:
is_ironpython = platform.python_implementation() == "IronPython"
しかし残念なことに、プラットフォーム モジュールは Python の実装間で一貫して実装されていません (または場合によってはまったく... *咳* Jython *咳*)。
私はこれを使用します:
if hasattr(platform, "python_implementation"):
is_ironpython = "ironpython" in platform.python_implementation.lower()
else:
try:
import clr
except ImportError:
is_ironpython = False
else:
is_ironpython = True
「cli」(= Common Language Infrastructure = .NET = IronPython) はおそらく信頼できます。
私の知る限り、IronPython 内で .NET ライブラリにアクセスできるので、.NET ライブラリをインポートしてみて、(CPython のように).NET が利用できないときにスローされる例外をキャッチできます。