2010-05-08 4 views
15

Мне нужно написать модуль, который будет использоваться как из CPython, так и для IronPython. Каков наилучший способ обнаружения IronPython, так как в этом случае мне нужно немного другое поведение?Лучший способ обнаружения IronPython

Я заметил, что sys.platform является «win32» на CPython, но «cli» на IronPython.

Есть ли другой предпочтительный/стандартный способ его обнаружения?

+1

Как и в стороне, если вы можете обнаружить отличающееся поведение во время выполнения, который вы пытаетесь обойти, что может быть лучшим средством обнаружения, что делать, чем связывая его переводчика напрямую. Например, кто-то может развить IronPython; ваш код не будет работать, поскольку имя «IronPython» изменится. Проблема также может быть исправлена ​​в будущей версии, в результате чего ваш обходной путь будет нарушен. –

+0

Является ли эта проблема устаревшей? Документы записывают, что «sys.platform» IronPython возвращает аналогичный результат, как и для CPython https://ironpython-test.readthedocs.io/en/latest/library/sys.html – alvas

ответ

17

Новое в Python 2.6 platform.python_implementation:

Возвращает строку, идентифицирующую реализацию Python. Возможные значения возврата: «CPython», «IronPython», «Jython».

Это, наверное, самый чистый способ сделать это, и это примерно так же стандартно, как и получается. Тем не менее, я считаю, что Jython все еще работает 2.5, поэтому я не уверен, что вы можете положиться на это, чтобы обнаружить Jython еще (но это не было частью вашего вопроса).

+2

кажется немного сломанным в текущей реализации IronPython 2.6.1 :) – Meh

+0

Я могу подтвердить, что это работает с IronPython 2.7.4. –

2

«cli» (= Common Language Infrastructure = .NET = IronPython), вероятно, надежный.

Насколько я знаю, вы можете получить доступ к библиотекам .NET в IronPython, чтобы вы могли попробовать импортировать библиотеку .NET и поймать исключение, которое он бросает, когда .NET недоступен (как в CPython).

+0

Я всегда думал, что CLI - это интерфейс командной строки. Сокращения на самом деле заканчиваются: http://www.dilbert.com/fast/1993-06-23/. – extraneon

+0

Это действительно так! – LukeN

5

Следующий код будет работать с 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 (или вообще в некоторых случаях ... * кашель * 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 
Смежные вопросы