From 078fd8aa66d488d1339cb64a5a3918e786b4baae Mon Sep 17 00:00:00 2001 From: shadchin Date: Wed, 14 Jan 2026 19:52:47 +0300 Subject: Fix `__name__` for builtin modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Такой же подход есть у загрузки so-расширений, но для builtin его из коробки нет, так как builtin в upstream используется только для стандартной библиотеки, а там нет подпакетов, там только модули и у них нет проблемы с именем. До патча: ```ipython In [1]: import osgeo._gdal In [2]: osgeo._gdal.__name__ Out[2]: '_gdal' # <- Потерялось имя пакета, должно быть `osgeo._gdal` ``` После патча: ```ipython In [1]: import osgeo._gdal In [2]: osgeo._gdal.__name__ Out[2]: 'osgeo._gdal' ``` commit_hash:fee95110a58cae8395a46598bf8f0b80e42b029a --- contrib/tools/python3/Python/import.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'contrib/tools/python3/Python') diff --git a/contrib/tools/python3/Python/import.c b/contrib/tools/python3/Python/import.c index 8f8d5c25cb5..fe70169202c 100644 --- a/contrib/tools/python3/Python/import.c +++ b/contrib/tools/python3/Python/import.c @@ -1388,6 +1388,7 @@ is_builtin(PyObject *name) static PyObject* create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec) { + const char *oldcontext, *newcontext; PyObject *mod = import_find_extension(tstate, name, name); if (mod || _PyErr_Occurred(tstate)) { return mod; @@ -1401,7 +1402,13 @@ create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec) mod = PyImport_AddModuleObject(name); return Py_XNewRef(mod); } + newcontext = PyUnicode_AsUTF8(name); + if (newcontext == NULL) { + Py_RETURN_NONE; + } + oldcontext = _PyImport_SwapPackageContext(newcontext); mod = _PyImport_InitFunc_TrampolineCall(*p->initfunc); + _PyImport_SwapPackageContext(oldcontext); if (mod == NULL) { return NULL; } -- cgit v1.3