17370845950

如何检测当前 Python 是否运行在 GraalPy 或 PyPy
最可靠方式是检查 sys.implementation.name:CPython 返回 "cpython",PyPy 返回 "pypy",GraalPy 返回 "graalpython";该属性自 Python 3.3 起稳定存在,硬编码、不可篡改,优于 platform.python_implementation() 等易误判方法。

检查 sys.implementation.name 是最可靠方式

Python 的 sys.implementation 在 CPython、PyPy、GraalPy 中都存在,且 name 属性明确区分运行时:

  • CPython 返回 "cpython"
  • PyPy 返回 "pypy"
  • GraalPy 返回 "graalpython"

这个值由解释器硬编码,不会被环境变量或导入干扰,比查 platform.python_implementation() 更直接。

使用时注意:sys 模块必须已导入,且该属性在所有支持的 Python 版本(3.3+)中稳定存在。

避免依赖 platform.python_implementation()

platform.python_implementation() 看似直观,但它在 GraalPy 中仍返回 "CPython"(历史兼容行为),PyPy 则返回 "PyPy" —— 这导致它无法区分 CPython 和 GraalPy。

常见误判场景:

  • platform.python_implementation() == "CPython" 认为就是 CPython → 实际可能是 GraalPy
  • 只靠 sys.version 字符串匹配(如搜 "PyPy""GraalVM")→ GraalPy 3.11+ 版本可能不带 "GraalVM" 字样,且易被自定义 sys.version 干扰

补充验证:检查 sys.pycache_prefix__graalpython__

GraalPy 提供了额外标识,但不是所有版本都稳定可用:

  • sys.pycache_prefix 在 GraalPy 中通常为 None(CPython/PyPy 为字符串或 None,不可靠)
  • 更稳妥的是检查内置常量:hasattr(sys, 'graalpython') → GraalPy 22.3+ 支持,返回 True;PyPy 和 CPython 均无此属性

PyPy 可通过 sys.pypy_version_info 存在性判断,但 GraalPy 不提供类似结构,所以不能反向依赖。

实际检测函数建议

推荐封装一个轻量判断函数,兼顾可读与健壮:

import sys

def get_python_runtime(): name = sys.implementation.name if name == "graalpython": return "graalpy" elif name == "pypy": return "pypy" else: return "cpytho

n"

调用 get_python_runtime() 即可获得明确标识。不要试图合并判断逻辑(比如先查 __graalpython__ 再 fallback),因为 sys.implementation.name 已足够权威,且是唯一跨版本稳定的入口。

GraalPy 和 PyPy 的启动机制、JIT 行为、C 扩展兼容性差异极大,但它们共享的 sys.implementation.name 是目前唯一不需要 try/except 就能干净区分的信号。别绕路。