2010-05-08 18 views
15

Ho bisogno di scrivere un modulo che verrà utilizzato sia da CPython che da IronPython. Qual è il modo migliore per rilevare IronPython, dal momento che ho bisogno di un comportamento leggermente diverso in quel caso?Il modo migliore per rilevare IronPython

Ho notato che sys.platform è "win32" su CPython, ma "cli" su IronPython.

C'è un altro modo preferito/standard per rilevarlo?

+1

Per inciso, se è possibile rilevare il comportamento runtime diverso che si sta cercando di aggirare, che può essere un mezzo migliore per rilevare cosa fare rispetto legandolo a l'interprete direttamente Ad esempio, qualcuno potrebbe forgiare IronPython; il tuo codice non funzionerebbe poiché il nome "IronPython" cambierebbe. Il problema potrebbe anche essere risolto in una versione futura, causando l'interruzione della soluzione alternativa. –

+0

Questo problema è obsoleto? I documenti scrivono che 'sys.platform' di IronPython restituisce l'output simile a CPython https://ironpython-test.readthedocs.io/en/latest/library/sys.html – alvas

risposta

17

nuovo in Python 2.6 è platform.python_implementation:

Restituisce una stringa che identifica l'implementazione di Python. I possibili valori di ritorno sono: 'CPython', 'IronPython', 'Jython'.

Questo è probabilmente il modo più pulito per farlo, e questo è lo standard che ottiene. Comunque, credo che Jython stia ancora eseguendo 2.5, quindi non sono sicuro che tu possa fare affidamento su questo per rilevare Jython (ma non era comunque parte della tua domanda).

+2

sembra essere un po 'rotto nell'attuale implementazione di IronPython 2.6.1 :) – Meh

+0

Posso confermare che funziona con IronPython 2.7.4. –

2

Il "cli" (= Common Language Infrastructure = .NET = IronPython) è probabilmente affidabile.

Per quanto ne so, è possibile accedere alle librerie .NET all'interno di IronPython, quindi è possibile provare a importare una libreria .NET e rilevare l'eccezione che genera quando .NET non è disponibile (come in CPython).

+0

Ho sempre pensato che CLI fosse un'interfaccia a linea di comando. Gli acronimi stanno per scadere: http://www.dilbert.com/fast/1993-06-23/. – extraneon

+0

Significa entrambi! – LukeN

5

Il seguente codice funzionerà con CPython 2.6 e Iron Python 2.6 (.NET 2.0). Ma non funzionerà con Iron Python 2.6 (.NET 4.0), c'è qualche problema con platform.py che analizza il numero di versione. Ho presentato un difetto a Python.org. La riparazione di platform.py non è poi così difficile.

import sys 
import platform 

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

print IsIronPython() 
3

Idealmente:

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

Ma purtroppo il modulo della piattaforma non è implementata in modo coerente in tutta implementazioni Python (o del tutto in alcuni casi ... * cough * * cough * Jython).

Io uso questo:

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 
Problemi correlati