2010-05-08 40 views
15

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

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

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

+1

顺便说一句,如果你能发现你正在试图解决的不同运行时的行为,可以被检测到有什么比它绑做一个更好的方法口译员直接​​。例如,有人可能会分叉IronPython;你的代码不会工作,因为名字“IronPython”会改变。该问题也可能在未来的版本中得到解决,导致您的解决方法中断。 – 2010-05-08 20:49:16

+0

这个问题过时了吗?文档写道,IronPython的'sys.platform'返回类似于CPython的输出https://ironpython-test.readthedocs.io/en/latest/library/sys.html – alvas 2017-04-25 00:50:01

回答

17

新的Python 2.6是platform.python_implementation

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

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

+2

在当前的IronPython 2.6.1实现中似乎有点破碎:) – Meh 2010-05-08 19:49:25

+0

我可以确认这适用于IronPython 2.7.4。 – 2014-05-13 22:16:03

2

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

据我所知,你可以访问IronPython中的.NET库,这样你就可以尝试导入一个.NET库,并捕捉它在.NET不可用时引发的异常(如在CPython中)。

+0

我一直认为CLI是命令行界面。首字母缩略词确实不多了:http://www.dilbert.com/fast/1993-06-23/。 – extraneon 2010-05-08 19:24:35

+0

它的意思是两个! – LukeN 2010-05-08 20:33:02

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() 
3

理想:

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

但不幸的是平台模块不能跨Python实现一贯的执行(或根本在某些情况下... *咳嗽* Jython的*咳嗽*)。

我用这个:

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 
相关问题