Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Python: Drop support for Python 3.7
Debian 10 is not anymore a supported distro, since Debian 12 was
released on June 10, 2023.  Our supported build platforms as of today
all support at least 3.8 (and all of them except for Ubuntu 20.04
support 3.9):

openSUSE Leap 15.5: 3.6.15 (3.11.2)
CentOS Stream 8:    3.6.8  (3.8.13, 3.9.16, 3.11.4)
CentOS Stream 9:    3.9.17 (3.11.4)
Fedora 37:          3.11.4
Fedora 38:          3.11.4
Debian 11:          3.9.2
Debian 12:          3.11.2
Alpine 3.14, 3.15:  3.9.16
Alpine 3.16, 3.17:  3.10.10
Ubuntu 20.04 LTS:   3.8.10
Ubuntu 22.04 LTS:   3.10.12
NetBSD 9.3:         3.9.13*
FreeBSD 12.4:       3.9.16
FreeBSD 13.1:       3.9.18
OpenBSD 7.2:        3.9.17

Note: NetBSD does not appear to have a default meta-package, but offers
several options, the lowest of which is 3.7.15. However, "python39"
appears to be a pre-requisite to one of the other packages we request
in tests/vm/netbsd.

Since it is safe under our supported platform policy, bump our
minimum supported version of Python to 3.8.  The two most interesting
features to have by default include:

- the importlib.metadata module, whose lack is responsible for over 100
  lines of code in mkvenv.py

- improvements to asyncio, for example asyncio.CancelledError
  inherits from BaseException rather than Exception

In addition, code can now use the assignment operator ':='

Because mypy now learns about importlib.metadata, a small change to
mkvenv.py is needed to pass type checking.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
bonzini committed Sep 7, 2023
1 parent a5e9fbf commit ca056f4
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 15 deletions.
8 changes: 4 additions & 4 deletions configure
Expand Up @@ -552,16 +552,16 @@ if test -n "$linux_arch" && ! test -d "$source_path/linux-headers/asm-$linux_arc
fi

check_py_version() {
# We require python >= 3.7.
# We require python >= 3.8.
# NB: a True python conditional creates a non-zero return code (Failure)
"$1" -c 'import sys; sys.exit(sys.version_info < (3,7))'
"$1" -c 'import sys; sys.exit(sys.version_info < (3,8))'
}

first_python=
if test -z "${PYTHON}"; then
# A bare 'python' is traditionally python 2.x, but some distros
# have it as python 3.x, so check in both places.
for binary in python3 python python3.11 python3.10 python3.9 python3.8 python3.7; do
for binary in python3 python python3.11 python3.10 python3.9 python3.8; do
if has "$binary"; then
python=$(command -v "$binary")
if check_py_version "$python"; then
Expand Down Expand Up @@ -952,7 +952,7 @@ then
fi

if ! check_py_version "$python"; then
error_exit "Cannot use '$python', Python >= 3.7 is required." \
error_exit "Cannot use '$python', Python >= 3.8 is required." \
"Use --python=/path/to/python to specify a supported Python." \
"Maybe try:" \
" openSUSE Leap 15.3+: zypper install python39" \
Expand Down
8 changes: 4 additions & 4 deletions python/Makefile
Expand Up @@ -9,13 +9,13 @@ help:
@echo "make check-minreqs:"
@echo " Run tests in the minreqs virtual environment."
@echo " These tests use the oldest dependencies."
@echo " Requires: Python 3.7"
@echo " Hint (Fedora): 'sudo dnf install python3.7'"
@echo " Requires: Python 3.8"
@echo " Hint (Fedora): 'sudo dnf install python3.8'"
@echo ""
@echo "make check-tox:"
@echo " Run tests against multiple python versions."
@echo " These tests use the newest dependencies."
@echo " Requires: Python 3.7 - 3.11, and tox."
@echo " Requires: Python 3.8 - 3.11, and tox."
@echo " Hint (Fedora): 'sudo dnf install python3-tox python3.11'"
@echo " The variable QEMU_TOX_EXTRA_ARGS can be use to pass extra"
@echo " arguments to tox".
Expand Down Expand Up @@ -59,7 +59,7 @@ PIP_INSTALL = pip install --disable-pip-version-check
min-venv: $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate
$(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate: setup.cfg tests/minreqs.txt
@echo "VENV $(QEMU_MINVENV_DIR)"
@python3.7 -m venv $(QEMU_MINVENV_DIR)
@python3.8 -m venv $(QEMU_MINVENV_DIR)
@( \
echo "ACTIVATE $(QEMU_MINVENV_DIR)"; \
. $(QEMU_MINVENV_DIR)/bin/activate; \
Expand Down
5 changes: 4 additions & 1 deletion python/scripts/mkvenv.py
Expand Up @@ -435,21 +435,24 @@ def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
try:
# First preference: Python 3.8+ stdlib
from importlib.metadata import ( # type: ignore
EntryPoint,
PackageNotFoundError,
distribution,
)
except ImportError as exc:
logger.debug("%s", str(exc))
# Second preference: Commonly available PyPI backport
from importlib_metadata import ( # type: ignore
EntryPoint,
PackageNotFoundError,
distribution,
)

def _generator() -> Iterator[str]:
for package in packages:
try:
entry_points = distribution(package).entry_points
entry_points: Iterator[EntryPoint] = \
iter(distribution(package).entry_points)
except PackageNotFoundError:
continue

Expand Down
7 changes: 3 additions & 4 deletions python/setup.cfg
Expand Up @@ -14,15 +14,14 @@ classifiers =
Natural Language :: English
Operating System :: OS Independent
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Typing :: Typed

[options]
python_requires = >= 3.7
python_requires = >= 3.8
packages =
qemu.qmp
qemu.machine
Expand Down Expand Up @@ -76,7 +75,7 @@ exclude = __pycache__,

[mypy]
strict = True
python_version = 3.7
python_version = 3.8
warn_unused_configs = True
namespace_packages = True
warn_unused_ignores = False
Expand Down Expand Up @@ -192,7 +191,7 @@ multi_line_output=3
# of python available on your system to run this test.

[tox:tox]
envlist = py37, py38, py39, py310, py311
envlist = py38, py39, py310, py311
skip_missing_interpreters = true

[testenv]
Expand Down
2 changes: 1 addition & 1 deletion python/tests/minreqs.txt
@@ -1,5 +1,5 @@
# This file lists the ***oldest possible dependencies*** needed to run
# "make check" successfully under ***Python 3.7***. It is used primarily
# "make check" successfully under ***Python 3.8***. It is used primarily
# by GitLab CI to ensure that our stated minimum versions in setup.cfg
# are truthful and regularly validated.
#
Expand Down
2 changes: 1 addition & 1 deletion scripts/qapi/mypy.ini
@@ -1,7 +1,7 @@
[mypy]
strict = True
disallow_untyped_calls = False
python_version = 3.7
python_version = 3.8

[mypy-qapi.schema]
disallow_untyped_defs = False
Expand Down

0 comments on commit ca056f4

Please sign in to comment.