.. towncrier-draft-entries::
- Discard malformed interpreter cache entries and query the interpreter again, including entries with missing,
non-string or unusable
system_executablepaths - by :user:`darrenhuai`. (:issue:`141`) - Use the default interpreter query timeout and warn for invalid
PY_DISCOVERY_TIMEOUTvalues. Acceptinfor values above the subprocess wait limit to disable the timeout - by :user:`darrenhuai`. (:issue:`143`)
- Skip empty
PATHentries during interpreter discovery - by :user:`gaborbernat`. (:issue:`129`)
- Document :attr:`~python_discovery.PythonInfo.system_exe` across the tutorial, the how-to guide and the explanation of
how resolution reaches a base interpreter. The class diagram in the how-to guide had
:attr:`~python_discovery.PythonInfo.system_executable` typed
strrather thanstr | None- by :user:`gaborbernat`. (:issue:`128`)
- :attr:`~python_discovery.PythonInfo.system_exe` returns the executable of the system Python an interpreter is based on,
falling back to :attr:`~python_discovery.PythonInfo.executable` the way
:meth:`~python_discovery.PythonInfo.resolve_to_system` does. :attr:`~python_discovery.PythonInfo.system_executable` is
Noneuntil resolution runs, so every consumer had to narrow a value discovery has already settled - by :user:`gaborbernat`. (:issue:`127`)
- Restore discovery of Python 3.6 and 3.7 interpreters: the interrogation script had grown 3.8-only syntax and is now
kept to Python 3.6. Candidates below 3.6 log one warning naming the version found instead of two debug-level query
attempts, and the verdict is cached so they are queried only once; an absolute-path spec for one raises
RuntimeErrorwith the same message - by :user:`gaborbernat`. (:issue:`116`) - Prefer the version-matched system executable when CPython reports an existing generic executable for a copied POSIX virtual environment. (:issue:`124`)
- Document the version floors: runs on Python 3.8+, discovers interpreters down to 3.6 - by :user:`gaborbernat`. (:issue:`116`)
- Locate uv's interpreter store the way uv does, using XDG on macOS (
~/.local/share/uv/python) and roaming%APPDATA%\uv\pythonon Windows, neither of whichplatformdirsreported. The uv variables now come from theenvmapping rather thanos.environ- by :user:`gaborbernat`. (:issue:`109`) - Pick uv-managed interpreters by install directory name instead of globbing the store. A bare
3.8now means CPython, the way uv resolves it, rather than whichever implementation the filesystem happened to list first, and probing runs newest version first - by :user:`gaborbernat`. (:issue:`110`)
- Drop the
platformdirsruntime dependency; locating uv's store was the only thing it did - by :user:`gaborbernat`. (:issue:`109`)
- Declare support for Python 3.15 and run the test suite against it, currently in beta. (:issue:`104`)
- Parse the debug build flag in interpreter specs -
python3.13dand Debian'spython3.13-dbg/python3.13-debugnow select aPy_DEBUGinterpreter instead of being misread as an ISA nameddbg. Resolving a virtualenv to its base interpreter also checks the free-threaded and debug ABI flags, so a debug or free-threaded environment no longer resolves to a release build of the same version - by :user:`gaborbernat`. (:issue:`96`)
- Constrain the
hatchlingbuild requirement per Python version so sdist builds resolve a compatible backend on the declared>=3.8floor -hatchling>=1.28dropped Python 3.9, leaving 3.8/3.9 unbuildable from source - by :user:`gaborbernat`. (:issue:`92`)
- Stop executable symlink resolution once the stdlib landmark is reachable and keep macOS framework builds untouched,
matching
getpath- Homebrew interpreters no longer get version-pinnedCellarpaths recorded and stable aliases such as Debian's/usr/bin/python3are preserved - by :user:`gaborbernat`. (:issue:`86`)
- Resolve executable-only symlinks when computing
system_executable, mirroring CPython'sgetpath.realpath(python/cpython#115237): a symlink to the interpreter binary now resolves to the real interpreter, while a fully symlinked interpreter tree is kept as-is - by :user:`gaborbernat`. (:issue:`84`)
- Add
debug_buildattribute to :class:`PythonInfo` exposing whether the interpreter is a debug build (Py_DEBUG) - by :user:`gaborbernat`. (:issue:`80`)
No significant changes.
- export normalize_isa and deprecate KNOWN_ARCHITECTURES - by :user:`rahuldevikar`. (:issue:`59`)
- discover uv-managed Pythons on Windows. Previously the glob assumed Unix layout (
<root>/<key>/bin/python) and silently found nothing on Windows, where uv placespython.exedirectly under the install root - by :user:`gaborbernat`. (:issue:`65`) - Canonicalize GraalVM to match GraalPy Python interpreter in PythonSpec and PythonInfo. - by :user:`timfel`. (:issue:`73`)
- Add :func:`~python_discovery.iter_interpreters` for enumerating every discovered interpreter, with PATH and UV-install support for non-CPython implementations listed in :data:`~python_discovery.KNOWN_IMPLEMENTATIONS` (:pull:`71`)
- Export
normalize_isaand deprecateKNOWN_ARCHITECTURES(:pull:`62`)
- Expose
KNOWN_ARCHITECTURESas public API (:pull:`56`)
- Add zizmor security auditing for workflows (:pull:`55`)
- Increase interpreter query timeout to 15s, with an override (:pull:`53`)
- Add
loongarch64to known ISAs (:pull:`50`)
- Match prerelease versions against
major.minorspecs (:pull:`48`) - Drain pipes after killing a timed-out interpreter probe (:pull:`49`)
- Add package description and usage to the README (:pull:`46`)
- Add a timeout to interpreter probing (:pull:`42`)
- Add
i686to known ISAs (:pull:`43`)
- Add a security policy and workflow permissions hardening (:pull:`33`)
- Add a
predicateparameter to :func:`~python_discovery.get_interpreter` (:pull:`31`)
- Fix the ReadTheDocs build (:pull:`29`)
- Add
:param:descriptions to all public APIs (:pull:`32`)
- Initial release as a standalone package, extracted from
virtualenv(:pull:`28`)