This page records which Python versions pyEuropePMC supports and how CI tests each of them. It also sets out the plan for Python 3.10 reaching end of life in October 2026 and for adding Python 3.14 and 3.15.
pyproject.toml declares requires-python = ">=3.10,<4.0" and classifiers for Python 3.10, 3.11, 3.12 and 3.13.
| Python | Upstream status in September 2026 | End of life | Tested in CI |
|---|---|---|---|
| 3.10 | security fixes only | October 2026 | the full test suite on Linux and Windows, and every other Linux job |
| 3.11 | security fixes only | October 2027 | compilation, imports and the CLI |
| 3.12 | security fixes only | October 2028 | the full test suite on Linux, Windows and macOS, and release verification |
| 3.13 | bug fixes | October 2029 | compilation, imports and the CLI |
| 3.14 | bug fixes; released 7 October 2025 | October 2030 | not tested or declared |
| 3.15 | pre-release; release planned for 1 October 2026 | October 2031 | not tested |
The upstream dates come from the Python Developer’s Guide.
python-compatibility.yml compiles the package, imports and constructs the public clients, and runs pyeuropepmc --help on Python 3.10, 3.11, 3.12 and 3.13, on Ubuntu with core dependencies only.cdci.yml, unit-tests.yml, integration-tests.yml, benchmark.yml and analyze_repo.yml run on Python 3.10, which is also the default of the setup-python-env composite action.release.yml verifies and builds on Python 3.12.target-version = "py310"), so its pyupgrade fixes never introduce syntax the minimum version lacks.python_version = "3.12") regardless of the minimum version. Compiling on each interpreter is what catches syntax a version does not support.requires-python is part of the package metadata, so pip and uv on a Python version that is no longer supported keep installing the last release that supports it.
Python 3.10 reaches end of life in October 2026.
## [Unreleased] in CHANGELOG.md that the first release after October 2026 requires Python 3.11 or later.pyproject.toml:
requires-python = ">=3.11,<4.0", and python = ">=3.11,<4.0" in [tool.poetry.dependencies];Programming Language :: Python :: 3.10 classifier;target-version = "py311" in [tool.ruff];[tool.mypy] comment that refers to Python 3.10.Re-lock. poetry check --lock fails as soon as the Python constraint changes:
poetry lock
Then regenerate requirements.txt with the pinned exporter:
uvx --from poetry==2.3.2 --with poetry-plugin-export==1.10.0 poetry export --without-hashes -f requirements.txt -o requirements.txt
Apply the pyupgrade fixes the new target enables. With py311, ruff reports eight UP017 findings, where datetime.timezone.utc becomes datetime.UTC:
poetry run ruff check --fix src/ tests/
python-version: '3.10' in cdci.yml (both jobs), unit-tests.yml, integration-tests.yml, benchmark.yml and analyze_repo.yml;python-version default in .github/actions/setup-python-env/action.yml;python-compatibility.yml, the syntax-check matrix, the core-tests matrix and its macOS exclusion, and the support text in the compatibility-summary job.PYTHON_VERSION in the Makefile, and remove py310 from env_list in tox.ini.README.md, docs/README.md, the pages in docs/getting-started/ and this page.CHANGELOG.md.No required status check has a Python version in its name, so the branch ruleset does not change.
Python 3.14 is neither declared nor tested. Two locked dependencies publish no Python 3.14 wheels, so installing on 3.14 builds them from source:
rapidfuzz, a core dependency, is constrained to >=2.15.0,<3.0. The locked 2.15.2 has CPython wheels up to 3.12 only, so installs on 3.13 already build it from source. Current rapidfuzz releases have 3.14 wheels and require Python 3.11 or later.numpy, used by the analytics, visualization, export, standard and all extras, is locked at 2.2.6, which has wheels up to 3.13. numpy releases from 2.3 on require Python 3.11 or later, and 2.5 requires 3.12.Both fit naturally after the 3.10 drop:
Widen the rapidfuzz upper bound. poetry lock keeps the versions already locked where they still fit, so move both packages explicitly:
poetry update rapidfuzz numpy
'3.14' to the syntax-check matrix in python-compatibility.yml. The composite action sets allow-prereleases: true, so 3.15 release candidates can be added the same way.syntax-check matrix once it is released.