瀏覽代碼

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>
Paolo Bonzini 2 年之前
父節點
當前提交
ca056f4499
共有 6 個文件被更改,包括 17 次插入15 次删除
  1. 4 4
      configure
  2. 4 4
      python/Makefile
  3. 4 1
      python/scripts/mkvenv.py
  4. 3 4
      python/setup.cfg
  5. 1 1
      python/tests/minreqs.txt
  6. 1 1
      scripts/qapi/mypy.ini

+ 4 - 4
configure

@@ -552,16 +552,16 @@ if test -n "$linux_arch" && ! test -d "$source_path/linux-headers/asm-$linux_arc
 fi
 fi
 
 
 check_py_version() {
 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)
     # 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=
 first_python=
 if test -z "${PYTHON}"; then
 if test -z "${PYTHON}"; then
     # A bare 'python' is traditionally python 2.x, but some distros
     # A bare 'python' is traditionally python 2.x, but some distros
     # have it as python 3.x, so check in both places.
     # 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
         if has "$binary"; then
             python=$(command -v "$binary")
             python=$(command -v "$binary")
             if check_py_version "$python"; then
             if check_py_version "$python"; then
@@ -952,7 +952,7 @@ then
 fi
 fi
 
 
 if ! check_py_version "$python"; then
 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." \
              "Use --python=/path/to/python to specify a supported Python." \
              "Maybe try:" \
              "Maybe try:" \
              "  openSUSE Leap 15.3+: zypper install python39" \
              "  openSUSE Leap 15.3+: zypper install python39" \

+ 4 - 4
python/Makefile

@@ -9,13 +9,13 @@ help:
 	@echo "make check-minreqs:"
 	@echo "make check-minreqs:"
 	@echo "    Run tests in the minreqs virtual environment."
 	@echo "    Run tests in the minreqs virtual environment."
 	@echo "    These tests use the oldest dependencies."
 	@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 ""
 	@echo "make check-tox:"
 	@echo "make check-tox:"
 	@echo "    Run tests against multiple python versions."
 	@echo "    Run tests against multiple python versions."
 	@echo "    These tests use the newest dependencies."
 	@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 "    Hint (Fedora): 'sudo dnf install python3-tox python3.11'"
 	@echo "    The variable QEMU_TOX_EXTRA_ARGS can be use to pass extra"
 	@echo "    The variable QEMU_TOX_EXTRA_ARGS can be use to pass extra"
 	@echo "    arguments to tox".
 	@echo "    arguments to tox".
@@ -59,7 +59,7 @@ PIP_INSTALL = pip install --disable-pip-version-check
 min-venv: $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate
 min-venv: $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate
 $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate: setup.cfg tests/minreqs.txt
 $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate: setup.cfg tests/minreqs.txt
 	@echo "VENV $(QEMU_MINVENV_DIR)"
 	@echo "VENV $(QEMU_MINVENV_DIR)"
-	@python3.7 -m venv $(QEMU_MINVENV_DIR)
+	@python3.8 -m venv $(QEMU_MINVENV_DIR)
 	@(								\
 	@(								\
 		echo "ACTIVATE $(QEMU_MINVENV_DIR)";			\
 		echo "ACTIVATE $(QEMU_MINVENV_DIR)";			\
 		. $(QEMU_MINVENV_DIR)/bin/activate;			\
 		. $(QEMU_MINVENV_DIR)/bin/activate;			\

+ 4 - 1
python/scripts/mkvenv.py

@@ -435,6 +435,7 @@ def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
     try:
     try:
         # First preference: Python 3.8+ stdlib
         # First preference: Python 3.8+ stdlib
         from importlib.metadata import (  # type: ignore
         from importlib.metadata import (  # type: ignore
+            EntryPoint,
             PackageNotFoundError,
             PackageNotFoundError,
             distribution,
             distribution,
         )
         )
@@ -442,6 +443,7 @@ def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
         logger.debug("%s", str(exc))
         logger.debug("%s", str(exc))
         # Second preference: Commonly available PyPI backport
         # Second preference: Commonly available PyPI backport
         from importlib_metadata import (  # type: ignore
         from importlib_metadata import (  # type: ignore
+            EntryPoint,
             PackageNotFoundError,
             PackageNotFoundError,
             distribution,
             distribution,
         )
         )
@@ -449,7 +451,8 @@ def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
     def _generator() -> Iterator[str]:
     def _generator() -> Iterator[str]:
         for package in packages:
         for package in packages:
             try:
             try:
-                entry_points = distribution(package).entry_points
+                entry_points: Iterator[EntryPoint] = \
+                    iter(distribution(package).entry_points)
             except PackageNotFoundError:
             except PackageNotFoundError:
                 continue
                 continue
 
 

+ 3 - 4
python/setup.cfg

@@ -14,7 +14,6 @@ classifiers =
     Natural Language :: English
     Natural Language :: English
     Operating System :: OS Independent
     Operating System :: OS Independent
     Programming Language :: Python :: 3 :: Only
     Programming Language :: Python :: 3 :: Only
-    Programming Language :: Python :: 3.7
     Programming Language :: Python :: 3.8
     Programming Language :: Python :: 3.8
     Programming Language :: Python :: 3.9
     Programming Language :: Python :: 3.9
     Programming Language :: Python :: 3.10
     Programming Language :: Python :: 3.10
@@ -22,7 +21,7 @@ classifiers =
     Typing :: Typed
     Typing :: Typed
 
 
 [options]
 [options]
-python_requires = >= 3.7
+python_requires = >= 3.8
 packages =
 packages =
     qemu.qmp
     qemu.qmp
     qemu.machine
     qemu.machine
@@ -76,7 +75,7 @@ exclude = __pycache__,
 
 
 [mypy]
 [mypy]
 strict = True
 strict = True
-python_version = 3.7
+python_version = 3.8
 warn_unused_configs = True
 warn_unused_configs = True
 namespace_packages = True
 namespace_packages = True
 warn_unused_ignores = False
 warn_unused_ignores = False
@@ -192,7 +191,7 @@ multi_line_output=3
 # of python available on your system to run this test.
 # of python available on your system to run this test.
 
 
 [tox:tox]
 [tox:tox]
-envlist = py37, py38, py39, py310, py311
+envlist = py38, py39, py310, py311
 skip_missing_interpreters = true
 skip_missing_interpreters = true
 
 
 [testenv]
 [testenv]

+ 1 - 1
python/tests/minreqs.txt

@@ -1,5 +1,5 @@
 # This file lists the ***oldest possible dependencies*** needed to run
 # 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
 # by GitLab CI to ensure that our stated minimum versions in setup.cfg
 # are truthful and regularly validated.
 # are truthful and regularly validated.
 #
 #

+ 1 - 1
scripts/qapi/mypy.ini

@@ -1,7 +1,7 @@
 [mypy]
 [mypy]
 strict = True
 strict = True
 disallow_untyped_calls = False
 disallow_untyped_calls = False
-python_version = 3.7
+python_version = 3.8
 
 
 [mypy-qapi.schema]
 [mypy-qapi.schema]
 disallow_untyped_defs = False
 disallow_untyped_defs = False