在 Python 中,如何测试解释器是否正在运行 Pyston、Jython、CPython?

roc*_*cky 6 python pypy jython anaconda

如果解释器正在运行 pyston、jython、ironpython、pypy 等,我想从正在运行的 Python 程序内部进行测试。

想到的事情是模式匹配system.version和检查来自 的幻数imp.get_magic()但是这两者似乎都有些脆弱和笨拙。还有其他建议吗?

编辑: user2357112 再次通过。

我尝试在我安装的每个 Python 版本上运行以下代码,这区分了 Jython、Pyston 和各种 CPython。它失败的地方是 2.6 之前的 Python,以及 CPython 的 anaconda 变体。对于 anaconda 来说,这可能是正确的。

这是程序和结果。请随意注意这对哪些其他类型的 Python 有效或无效。

import platform
print(platform.python_implementation())
Run Code Online (Sandbox Code Playgroud)

和shell脚本:

for v in $(pyenv versions); do # not quite right
    pyenv local $v
    echo "version is $v"
    python /tmp/foo.py
    echo "==================="
done
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

===================
version is 2.1.3
Traceback (most recent call last):
  File "/tmp/foo.py", line 1, in ?
    import platform
ImportError: No module named platform
===================
version is 2.2.3
Traceback (most recent call last):
  File "/tmp/foo.py", line 1, in ?
    import platform
ImportError: No module named platform
===================
version is 2.3.7
Traceback (most recent call last):
  File "/tmp/foo.py", line 2, in ?
    print(platform.python_implementation())
AttributeError: 'module' object has no attribute 'python_implementation'
===================
version is 2.4.6
Traceback (most recent call last):
  File "/tmp/foo.py", line 2, in ?
    print(platform.python_implementation())
AttributeError: 'module' object has no attribute 'python_implementation'
===================
version is 2.5.6
Traceback (most recent call last):
  File "/tmp/foo.py", line 2, in <module>
    print(platform.python_implementation())
AttributeError: 'module' object has no attribute 'python_implementation'
===================
version is 2.6.9
CPython
===================
version is 2.7.12
CPython
===================
version is 2.7.13
CPython
===================
version is 2.7.8
CPython
===================
version is 3.0.1
CPython
===================
version is 3.1.5
CPython
===================
version is 3.2.6
CPython
===================
version is 3.3.5
CPython
===================
version is 3.3.6
CPython
===================
version is 3.4.2
CPython
===================
version is 3.5.0
CPython
===================
version is 3.5.1
CPython
===================
version is 3.5.2
CPython
===================
version is 3.6.0
CPython
===================
version is 3.6.0a4
CPython
===================
version is 3.6.0b2
CPython
===================
version is 3.6.1
CPython
===================
version is 3.6.2
CPython
===================
version is 3.7-dev
CPython
===================
version is anaconda2-4.1.1
CPython
===================
version is anaconda3-4.1.0
CPython
===================
version is jython-2.7.1b3
Jython
===================
version is pypy2-5.4.1
PyPy
===================
version is pypy2-5.6.0
PyPy
===================
version is pypy-2.6.1
PyPy
===================
version is pypy3-2.3.1
PyPy
===================
version is pypy3-2.4.0
PyPy
===================
version is pypy3.5-5.8.0
PyPy
===================
version is pypy-5.0.1
PyPy
===================
version is pypy-5.3.1
PyPy
===================
version is pyston-0.6.0
Pyston
===================
version is pyston-0.6.1
Pyston
===================
Run Code Online (Sandbox Code Playgroud)

Fra*_*uzo 5

正如 user2357112 提到的,您可以检查platform.python_implementation() == "Pyston",正如您在源代码中看到的那样。