我需要编写一个将在CPython和IronPython中使用的模块。检测IronPython的最佳方法是什么,因为在这种情况下我需要稍微不同的行为?
我注意到CPython上的sys.platform是“win32”,而IronPython上的“cli”。
是否有其他首选/标准的检测方式?
答案 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中)。