检测IronPython的最佳方法

时间:2010-05-08 18:54:44

标签: python ironpython version detection

我需要编写一个将在CPython和IronPython中使用的模块。检测IronPython的最佳方法是什么,因为在这种情况下我需要稍微不同的行为?

我注意到CPython上的sys.platform是“win32”,而IronPython上的“cli”。

是否有其他首选/标准的检测方式?

4 个答案:

答案 0 :(得分:17)

Python 2.6中的新功能是platform.python_implementation

  

返回标识Python实现的字符串。可能的返回值是:'CPython','IronPython','Jython'。

这可能是最干净的方式,而且这是标准的。但是,我相信Jython仍然运行2.5,所以我不确定你是否可以依赖它来检测Jython(但这不是你问题的一部分)。

答案 1 :(得分:5)

以下代码适用于CPython 2.6和Iron Python 2.6(.NET 2.0)。 但不适用于Iron Python 2.6(.NET 4.0),platform.py解析版本号存在一些问题。我向Python.org提交了一个缺陷。修复platform.py并不困难。

import sys
import platform

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

print IsIronPython()

答案 2 :(得分: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

答案 3 :(得分:2)

“cli”(=公共语言基础设施= .NET = IronPython)可能是可靠的。

据我所知,您可以访问IronPython中的.NET库,因此您可以尝试导入.NET库,并捕获它在.NET不可用时抛出的异常(如在CPython中)。