platform: import _wmi on first use
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 76/100
- Tipo de issue
- Funcionalidade
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- python
- Domínio
- backend, performance
Direção de pesquisa
Leia Lib/platform.py, especialmente a importação de _wmi no nível do módulo e _wmi_query(); a issue inclui uma alteração proposta e o comportamento medido. Verifique os testes test_platform e test_wmi e, em seguida, confirme que importar platform evita carregar _wmi e que os auxiliares do Windows mencionados continuam retornando os mesmos valores.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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
- Linguagem predominante
- Python
- Estrelas
- 77.9k
- Forks
- 37.1k
- Merge médio
- 17h 43min
- PRs com merge (30d)
- 675
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de python/cpython
-
type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
OS-windows performance stdlib type-feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
build OS-unsupported OS-windows type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 60/100
Mantenedores costumam responder em até 1 dia
-
What's New in 3.12 credits the unstable C API tier to PEP 697 instead of PEP 689Talvez já em andamento @TheLouisMahdi assumiu há 4 dias. Abertadocs
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 82/100
python/cpython#161078 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
OS-windows type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Mantenedores costumam responder em até 1 dia
Todas as issues de python/cpython
Issues semelhantes
-
docs size:S
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
strawberry-graphql/strawberry#4794 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
dataforgoodfr/cetolog#21 ·
-
security_citations_test fails against ecc 2026.11.6: SECURITY.md quotes ecc v2026.11.2's linesAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
btclib-org/btclib#2932 ·
Mantenedores costumam responder em até 1 dia