Лучший способ обнаружения IronPython
Мне нужно написать модуль, который будет использоваться как из CPython, так и для IronPython. Какой лучший способ обнаружить IronPython, так как в этом случае мне нужно немного другое поведение?
Я заметил, что sys.platform является "win32" на CPython, но "cli" на IronPython.
Есть ли другой предпочтительный/стандартный способ его обнаружения?
Ответы
Ответ 1
Новое в Python 2.6 platform.python_implementation
:
Возвращает строку, идентифицирующую реализацию Python. Возможными значениями возврата являются: "CPython," IronPython "," Jython ".
Это, вероятно, самый чистый способ сделать это, и это примерно так же стандартно, как и получается. Тем не менее, я считаю, что Jython по-прежнему работает 2,5, поэтому я не уверен, что вы можете положиться на это, чтобы обнаружить Jython еще (но это не было частью вашего вопроса).
Ответ 2
Следующий код будет работать с CPython 2.6 и Iron Python 2.6 (.NET 2.0).
Но не будет работать с Iron Python 2.6 (.NET 4.0), есть некоторая проблема с партией version.py для версии. Я отправил дефект Python.org. Исправление platform.py не так сложно.
import sys
import platform
def IsIronPython():
return platform.python_implementation().lower().find("ironpython")!=-1
print IsIronPython()
Ответ 3
В идеале:
is_ironpython = platform.python_implementation() == "IronPython"
Но, к сожалению, модуль платформы не реализован последовательно в реализации Python (или вообще в некоторых случаях... * cough * Jython * cough *).
Я использую это:
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
Ответ 4
"cli" (= Common Language Infrastructure =.NET = IronPython), вероятно, надежна.
Насколько я знаю, вы можете получить доступ к библиотекам .NET в IronPython, чтобы попробовать импортировать .NET-библиотеку и поймать исключение, которое он выдает, когда .NET недоступен (как в CPython).