{"record":{"id":"b087c158daf1fc17","repo":"sgl-project/sglang","slug":"python-did-not-report-an-ext-suffix-for-native-ext","errorCode":null,"errorMessage":"Python did not report an EXT_SUFFIX for native extensions","messagePattern":"Python did not report an EXT_SUFFIX for native extensions","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/rust_extensions/loader.py","lineNumber":308,"sourceCode":"    serialized = json.dumps(\n        value, sort_keys=True, separators=(\",\", \":\"), ensure_ascii=True\n    ).encode()\n    return hashlib.sha256(serialized).hexdigest()\n\n\ndef _cache_root(cache_dir: Path | None) -> Path:\n    if cache_dir is not None:\n        return Path(cache_dir).expanduser().resolve()\n    sglang_cache = envs.SGLANG_CACHE_DIR.get()\n    return Path(sglang_cache).expanduser().resolve() / \"rust_extensions\"\n\n\ndef _cached_extension_path(\n    cache_root: Path, crate: _CrateSpec, fingerprint: str\n) -> Path:\n    extension_suffix = sysconfig.get_config_var(\"EXT_SUFFIX\")\n    if not extension_suffix:\n        raise RuntimeError(\"Python did not report an EXT_SUFFIX for native extensions\")\n    module_leaf = crate.python_module.rsplit(\".\", 1)[-1]\n    return (\n        cache_root\n        / \"artifacts\"\n        / crate.package\n        / fingerprint\n        / (module_leaf + extension_suffix)\n    )\n\n\n@contextmanager\ndef _filesystem_lock(path: Path) -> Iterator[None]:\n    path.parent.mkdir(parents=True, exist_ok=True)\n    with path.open(\"a+b\") as lock_file:\n        fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)\n        try:\n            yield\n        finally:","sourceCodeStart":290,"sourceCodeEnd":326,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/rust_extensions/loader.py#L290-L326","documentation":"sysconfig.get_config_var('EXT_SUFFIX') returned empty, so the loader cannot name the cached native extension file. Indicates a broken/unusual Python build.","triggerScenarios":"load_rust_extension on a Python interpreter built without extension suffix configuration (some embedded, stripped, or exotic builds).","commonSituations":"Embedded Python distributions, custom minimal Pythons, or sysconfig data missing; rarely on normal CPython installs.","solutions":["Use a standard CPython build","Set/repair the interpreter's sysconfig vars or pass a working sys.executable","Run `python -c \"import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))\"` to confirm the environment is broken"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import sysconfig\nassert sysconfig.get_config_var(\"EXT_SUFFIX\"), \"unsupported Python build\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use standard CPython distributions","Sanity-check sysconfig vars when targeting exotic runtimes"],"tags":["python","sysconfig","environment","native-extension"],"backgroundTag":"broken-python-build-config","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}