2010-05-08 15 views
15

Necesito escribir un módulo que se utilizará tanto en CPython como en IronPython. ¿Cuál es la mejor manera de detectar IronPython, ya que necesito un comportamiento ligeramente diferente en ese caso?La mejor manera de detectar IronPython

Me di cuenta de que sys.platform es "win32" en CPython, pero "cli" en IronPython.

¿Hay otra forma preferida/estándar de detectarlo?

+1

Como acotación al margen, si se puede detectar el comportamiento de ejecución diferentes, que usted está tratando de evitar, que puede ser un mejor medio de detectar qué hacer que atándolo a el intérprete directamente. Por ejemplo, alguien puede bifurcar IronPython; su código no funcionaría ya que el nombre "IronPython" cambiaría. El problema también puede solucionarse en una versión futura, lo que hace que su solución se rompa. –

+0

¿Está este problema desactualizado? The docs escribe que 'sys.platform' de IronPython devuelve el resultado similar a CPython https://ironpython-test.readthedocs.io/en/latest/library/sys.html – alvas

Respuesta

17

nuevo en Python 2.6 es platform.python_implementation:

Devuelve una cadena que identifica la implementación de Python. Los posibles valores de retorno son: 'CPython', 'IronPython', 'Jython'.

Esa es probablemente la forma más limpia de hacerlo, y eso es lo más estándar posible. Sin embargo, creo que Jython aún ejecuta 2.5, por lo que no estoy seguro de que pueda confiar en esto para detectar a Jython por el momento (pero eso no formaba parte de su pregunta de todos modos).

+2

parece estar un poco roto en la implementación actual de IronPython 2.6.1 :) – Meh

+0

Puedo confirmar que esto funciona con IronPython 2.7.4. –

2

El "cli" (= Common Language Infrastructure = .NET = IronPython) es probablemente confiable.

Hasta donde yo sé, puede acceder a las bibliotecas .NET dentro de IronPython, por lo que podría intentar importar una biblioteca .NET y atrapar la excepción que arroja cuando .NET no está disponible (como en CPython).

+0

Siempre pensé que CLI era una interfaz de línea de comandos. Los acrónimos realmente se están acabando: http://www.dilbert.com/fast/1993-06-23/. – extraneon

+0

¡Significa ambos! – LukeN

5

El siguiente código funcionará con CPython 2.6 y Iron Python 2.6 (.NET 2.0). Pero no funcionará con Iron Python 2.6 (.NET 4.0), hay algún problema con el análisis de platform.py del número de versión. Envié un defecto a Python.org. Reparar platform.py no es tan difícil.

import sys 
import platform 

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

print IsIronPython() 
3

Idealmente:

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

Pero por desgracia, el módulo de plataforma no se implementa constantemente a través de implementaciones de Python (o en absoluto en algunos casos ... * tos * * tos * Jython).

utilizo este:

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 
Cuestiones relacionadas