Лучший способ обнаружения 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).