platform: import _wmi on first use
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 76/100
- Type d'issue
- Fonctionnalité
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- python
- Domaine
- backend, performance
Piste de recherche
Lisez Lib/platform.py, en particulier l’importation de _wmi au niveau du module et _wmi_query() ; l’issue comprend une modification proposée et le comportement mesuré. Vérifiez les tests test_platform et test_wmi, puis confirmez que l’importation de platform évite de charger _wmi et que les fonctions auxiliaires Windows mentionnées renvoient toujours les mêmes valeurs.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Feature or enhancement
Lib/platform.py imports _wmi at module level on Windows. _wmi.pyd loads oleaut32.dll and propsys.dll (with _wmi.pyd itself and their dependencies, 7 more images in the process), but WMI is only queried by win32_ver(), version(), release(), uname() and the processor/machine helpers. Code that only imports platform, or calls python_version() or system(), pays for it anyway. pytest is one example: it imports platform on every run.
Moving the import into _wmi_query() (keeping the "unavailable" state so a failed import or query is not retried):
| 60 runs each, perf_counter around the import | before | after | difference |
|---|---|---|---|
import platform |
18.6 ms | 12.9 ms | −5.5 ms [−6.0, −5.1] |
import pytest |
206 ms | 196 ms | −9.5 ms [−13.6, −4.7] |
(python-build-standalone 3.14.4, Windows 11 26100.) win32_ver(), uname(), machine(), version() and processor() return the same values; test_platform and test_wmi pass.
The change, against main (2781ffe1f2):
diff --git a/Lib/platform.py b/Lib/platform.py
index c87bf2f..375acc2 100644
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -114,10 +114,10 @@ import sys
import functools
import itertools
lazy import warnings
-try:
- import _wmi
-except ImportError:
- _wmi = None
+# _wmi is imported on first use (see _wmi_query): loading it maps the OLE
+# and property-system DLLs, which most users of this module never need.
+# None means not imported yet, False means unavailable.
+_wmi = None
### Globals & Constants
@@ -332,6 +332,12 @@ def _syscmd_ver(system='', release='', version='',
def _wmi_query(table, *keys):
global _wmi
+ if _wmi is None:
+ try:
+ import _wmi as wmi
+ except ImportError:
+ wmi = False
+ _wmi = wmi
if not _wmi:
raise OSError("not supported")
table = {
@@ -344,7 +350,7 @@ def _wmi_query(table, *keys):
table,
)).split("\0")
except OSError:
- _wmi = None
+ _wmi = False
raise OSError("not supported")
split_data = (i.partition("=") for i in data)
dict_data = {i[0]: i[2] for i in split_data}
(PEP 810's lazy import doesn't fit here because the import sits in try/except ImportError.)
I used GitHub Copilot (Claude Opus 5.5 model) to trace this, build and time the prototype, and draft this issue. The measurements were run on my machine.
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
No response
- Langage dominant
- Python
- Étoiles
- 77.9k
- Forks
- 37.1k
- Merge moyen
- 17 h 43 min
- PR mergées (30 j)
- 675
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/cpython
-
type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
OS-windows performance stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
build OS-unsupported OS-windows type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 60/100
Les mainteneurs répondent en général sous 1 jour
-
What's New in 3.12 credits the unstable C API tier to PEP 697 instead of PEP 689Peut-être pris @TheLouisMahdi l’a pris il y a 4 jours. Ouvertedocs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
python/cpython#161078 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
OS-windows type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de python/cpython
Issues similaires
-
docs size:S
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
strawberry-graphql/strawberry#4794 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
dataforgoodfr/cetolog#21 ·
-
security_citations_test fails against ecc 2026.11.6: SECURITY.md quotes ecc v2026.11.2's linesOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
btclib-org/btclib#2932 ·
Les mainteneurs répondent en général sous 1 jour