2010-05-08 3 views
15

Ich muss ein Modul schreiben, das sowohl von CPython als auch von IronPython verwendet wird. Was ist der beste Weg, um IronPython zu erkennen, da ich in diesem Fall ein etwas anderes Verhalten brauche?Der beste Weg, um IronPython zu erkennen

Ich bemerkte, dass sys.platform "win32" auf CPython, aber "cli" auf IronPython ist.

Gibt es einen anderen bevorzugten/Standard Weg es zu erkennen?

+1

Als Nebenwirkung, wenn man die unterschiedlichen Laufzeitverhalten erkennen kann, die Sie versuchen, um zu arbeiten, dass ein besseres Mittel zur Detektion sein kann, was als sie binden zu tun der Dolmetscher direkt. Zum Beispiel kann jemand IronPython abzweigen; Ihr Code würde nicht funktionieren, da sich der Name "IronPython" ändern würde. Das Problem wird möglicherweise auch in einer zukünftigen Version behoben, sodass die Problemumgehung nicht mehr funktioniert. –

+0

Ist dieses Problem veraltet? Die Dokumentation schreibt, dass IronPythons 'sys.platform' die ähnliche Ausgabe wie CPython zurückgibt https://ironpython-test.readthedocs.io/en/latest/library/sys.html – alvas

Antwort

17

Neu in Python 2.6 ist platform.python_implementation:

Gibt eine Zeichenfolge, die die Implementierung Python zu identifizieren. Mögliche Rückgabewerte sind: 'CPython', 'IronPython', 'Jython'.

Das ist wahrscheinlich der sauberste Weg, und das ist so Standard wie es geht. Ich glaube jedoch, dass Jython immer noch 2.5 läuft, daher bin ich mir nicht sicher, ob Sie sich darauf verlassen können, Jython zu erkennen (aber das war sowieso nicht Teil Ihrer Frage).

+2

scheint in der aktuellen IronPython 2.6.1-Implementierung ein wenig kaputt zu sein :) – Meh

+0

Ich kann bestätigen, dass dies mit IronPython 2.7.4 funktioniert. –

2

Die "CLI" (= Common Language Infrastructure = .NET = IronPython) ist wahrscheinlich zuverlässig.

Soweit ich weiß, können Sie auf .NET-Bibliotheken innerhalb von IronPython zugreifen, also könnten Sie versuchen, eine .NET-Bibliothek zu importieren und die Ausnahme abfangen, wenn .NET nicht verfügbar ist (wie in CPython).

+0

Ich dachte immer, CLI sei die Befehlszeilenschnittstelle. Akronyme sind wirklich knapp: http://www.dilbert.com/fast/1993-06-23/. – extraneon

+0

Es bedeutet beides! – LukeN

5

Der folgende Code funktioniert mit CPython 2.6 und Iron Python 2.6 (.NET 2.0). Aber funktioniert nicht mit Iron Python 2.6 (.NET 4.0), gibt es ein Problem mit platform.py Parsing der Versionsnummer. Ich habe einen Fehler bei Python.org eingereicht. Platform.py zu reparieren ist nicht so schwierig.

import sys 
import platform 

def IsIronPython(): 
    return platform.python_implementation().lower().find("ironpython")!=-1 

print IsIronPython() 
3

Ideal:

is_ironpython = platform.python_implementation() == "IronPython" 

Aber leider ist die Plattform-Modul ist nicht konsistent über Python-Implementierungen (oder überhaupt in einigen Fällen ... * hust * * hust * Jython) umgesetzt.

Ich benutze diese:

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