检测 IronPython 的最佳方法

Posted

技术标签:

【中文标题】检测 IronPython 的最佳方法【英文标题】:Best way to detect IronPython 【发布时间】:2011-02-17 05:22:12 【问题描述】:

我需要编写一个可同时用于 CPython 和 IronPython 的模块。是什么,因为在这种情况下我需要稍微不同的行为?

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

是否有另一种首选/标准的检测方法?

【问题讨论】:

顺便说一句,如果您可以检测到您正在尝试解决的不同运行时行为,那么与直接将其绑定到解释器相比,这可能是检测要做什么的更好方法。例如,有人可能会分叉 IronPython;由于名称“IronPython”会更改,因此您的代码将不起作用。该问题也可能会在未来的版本中得到修复,从而导致您的解决方法失效。 这个问题过时了吗?文档写道 IronPython 的 sys.platform 返回与 CPython ironpython-test.readthedocs.io/en/latest/library/sys.html 类似的输出 【参考方案1】:

“cli”(= Common Language Infrastructure = .NET = IronPython)可能是可靠的。

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

【讨论】:

我一直认为 CLI 是命令行界面。首字母缩略词真的用完了:dilbert.com/fast/1993-06-23.【参考方案2】:

Python 2.6 中的新功能是platform.python_implementation:

返回一个标识 Python 实现的字符串。可能的返回值有:‘CPython’、‘IronPython’、‘Jython’。

这可能是最干净的方法,而且几乎是标准的。但是,我相信 Jython 仍在运行 2.5,因此我不确定您是否可以依靠它来检测 Jython(但无论如何这不是您问题的一部分)。

【讨论】:

在当前 IronPython 2.6.1 实现中似乎有点破 :)【参考方案3】:

以下代码适用于 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()

【讨论】:

【参考方案4】:

理想情况下:

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

【讨论】:

以上是关于检测 IronPython 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

循环 Python / IronPython 对象方法

在应用扩展中检测方向的最佳方法是啥?

用 php 检测浏览器的最佳方法是啥?

检测移动设备的最佳方法是啥?

csharp 小类调用IronPython并使用它的参数执行传入的方法名称。

检测用户何时离开网页的最佳方法?