我需要编写一个可用于 CPython 和 IronPython 的模块。检测 IronPython 的最佳方法是什么,因为在这种情况下我需要稍微不同的行为?
我注意到 sys.platform 在 CPython 上是“win32”,但在 IronPython 上是“cli”。
是否有另一种首选/标准的检测方法?
我需要编写一个可用于 CPython 和 IronPython 的模块。检测 IronPython 的最佳方法是什么,因为在这种情况下我需要稍微不同的行为?
我注意到 sys.platform 在 CPython 上是“win32”,但在 IronPython 上是“cli”。
是否有另一种首选/标准的检测方法?
Python 2.6 中的新功能是platform.python_implementation
:
返回一个标识 Python 实现的字符串。可能的返回值是:'CPython'、'IronPython'、'Jython'。
这可能是最干净的方法,并且几乎是标准的。但是,我相信 Jython 仍在运行 2.5,所以我不确定您是否可以依靠它来检测 Jython(但这不是您问题的一部分)。
以下代码适用于 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()
理想情况下:
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
“cli”(= Common Language Infrastructure = .NET = IronPython)可能是可靠的。
据我所知,您可以在 IronPython 中访问 .NET 库,因此您可以尝试导入 .NET 库,并在 .NET 不可用时捕获它抛出的异常(如在 CPython 中)。