gh-133644: remove deprecated PyImport_ImportModuleNoBlock (#133655)

This commit is contained in:
Bénédikt Tran 2025-05-08 15:08:43 +02:00 committed by GitHub
parent 26839eae20
commit a2c4467d06
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 20 additions and 34 deletions

View file

@ -16,19 +16,6 @@ Importing Modules
This is a wrapper around :c:func:`PyImport_Import()` which takes a This is a wrapper around :c:func:`PyImport_Import()` which takes a
:c:expr:`const char *` as an argument instead of a :c:expr:`PyObject *`. :c:expr:`const char *` as an argument instead of a :c:expr:`PyObject *`.
.. c:function:: PyObject* PyImport_ImportModuleNoBlock(const char *name)
This function is a deprecated alias of :c:func:`PyImport_ImportModule`.
.. versionchanged:: 3.3
This function used to fail immediately when the import lock was held
by another thread. In Python 3.3 though, the locking scheme switched
to per-module locks for most purposes, so this function's special
behaviour isn't needed anymore.
.. deprecated-removed:: 3.13 3.15
Use :c:func:`PyImport_ImportModule` instead.
.. c:function:: PyObject* PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist) .. c:function:: PyObject* PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)

View file

@ -1093,9 +1093,6 @@ PyImport_ImportModuleLevelObject:PyObject*:locals:0:???
PyImport_ImportModuleLevelObject:PyObject*:fromlist:0:??? PyImport_ImportModuleLevelObject:PyObject*:fromlist:0:???
PyImport_ImportModuleLevelObject:int:level:: PyImport_ImportModuleLevelObject:int:level::
PyImport_ImportModuleNoBlock:PyObject*::+1:
PyImport_ImportModuleNoBlock:const char*:name::
PyImport_ReloadModule:PyObject*::+1: PyImport_ReloadModule:PyObject*::+1:
PyImport_ReloadModule:PyObject*:m:0: PyImport_ReloadModule:PyObject*:m:0:

View file

@ -323,7 +323,6 @@ func,PyImport_ImportFrozenModuleObject,3.7,,
func,PyImport_ImportModule,3.2,, func,PyImport_ImportModule,3.2,,
func,PyImport_ImportModuleLevel,3.2,, func,PyImport_ImportModuleLevel,3.2,,
func,PyImport_ImportModuleLevelObject,3.7,, func,PyImport_ImportModuleLevelObject,3.7,,
func,PyImport_ImportModuleNoBlock,3.2,,
func,PyImport_ReloadModule,3.2,, func,PyImport_ReloadModule,3.2,,
func,PyIndex_Check,3.8,, func,PyIndex_Check,3.8,,
type,PyInterpreterState,3.2,,opaque type,PyInterpreterState,3.2,,opaque

View file

@ -2,7 +2,7 @@ Pending removal in Python 3.15
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* The bundled copy of ``libmpdecimal``. * The bundled copy of ``libmpdecimal``.
* The :c:func:`PyImport_ImportModuleNoBlock`: * The :c:func:`!PyImport_ImportModuleNoBlock`:
Use :c:func:`PyImport_ImportModule` instead. Use :c:func:`PyImport_ImportModule` instead.
* :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`: * :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`:
Use :c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project Use :c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project

View file

@ -3043,7 +3043,7 @@ Changes to Python's build process and to the C API include:
* Importing modules simultaneously in two different threads no longer * Importing modules simultaneously in two different threads no longer
deadlocks; it will now raise an :exc:`ImportError`. A new API deadlocks; it will now raise an :exc:`ImportError`. A new API
function, :c:func:`PyImport_ImportModuleNoBlock`, will look for a function, :c:func:`!PyImport_ImportModuleNoBlock`, will look for a
module in ``sys.modules`` first, then try to import it after module in ``sys.modules`` first, then try to import it after
acquiring an import lock. If the import lock is held by another acquiring an import lock. If the import lock is held by another
thread, an :exc:`ImportError` is raised. thread, an :exc:`ImportError` is raised.

View file

@ -870,7 +870,7 @@ to the C API.
* :c:func:`!PyNumber_Coerce`, :c:func:`!PyNumber_CoerceEx`, * :c:func:`!PyNumber_Coerce`, :c:func:`!PyNumber_CoerceEx`,
:c:func:`!PyMember_Get`, and :c:func:`!PyMember_Set` C APIs are removed. :c:func:`!PyMember_Get`, and :c:func:`!PyMember_Set` C APIs are removed.
* New C API :c:func:`PyImport_ImportModuleNoBlock`, works like * New C API :c:func:`!PyImport_ImportModuleNoBlock`, works like
:c:func:`PyImport_ImportModule` but won't block on the import lock :c:func:`PyImport_ImportModule` but won't block on the import lock
(returning an error instead). (returning an error instead).

View file

@ -2499,7 +2499,7 @@ Deprecated C APIs
which return a :term:`borrowed reference`. which return a :term:`borrowed reference`.
(Soft deprecated as part of :pep:`667`.) (Soft deprecated as part of :pep:`667`.)
* Deprecate the :c:func:`PyImport_ImportModuleNoBlock` function, * Deprecate the :c:func:`!PyImport_ImportModuleNoBlock` function,
which is just an alias to :c:func:`PyImport_ImportModule` since Python 3.3. which is just an alias to :c:func:`PyImport_ImportModule` since Python 3.3.
(Contributed by Victor Stinner in :gh:`105396`.) (Contributed by Victor Stinner in :gh:`105396`.)

View file

@ -164,3 +164,5 @@ Deprecated C APIs
Removed C APIs Removed C APIs
-------------- --------------
* :c:func:`!PyImport_ImportModuleNoBlock`: deprecated alias
of :c:func:`PyImport_ImportModule`.

View file

@ -829,7 +829,7 @@ Previous versions of CPython have always relied on a global import lock.
This led to unexpected annoyances, such as deadlocks when importing a module This led to unexpected annoyances, such as deadlocks when importing a module
would trigger code execution in a different thread as a side-effect. would trigger code execution in a different thread as a side-effect.
Clumsy workarounds were sometimes employed, such as the Clumsy workarounds were sometimes employed, such as the
:c:func:`PyImport_ImportModuleNoBlock` C API function. :c:func:`!PyImport_ImportModuleNoBlock` C API function.
In Python 3.3, importing a module takes a per-module lock. This correctly In Python 3.3, importing a module takes a per-module lock. This correctly
serializes importation of a given module from multiple threads (preventing serializes importation of a given module from multiple threads (preventing

View file

@ -51,9 +51,6 @@ PyAPI_FUNC(PyObject *) PyImport_AddModuleRef(
PyAPI_FUNC(PyObject *) PyImport_ImportModule( PyAPI_FUNC(PyObject *) PyImport_ImportModule(
const char *name /* UTF-8 encoded string */ const char *name /* UTF-8 encoded string */
); );
Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock(
const char *name /* UTF-8 encoded string */
);
PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel( PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(
const char *name, /* UTF-8 encoded string */ const char *name, /* UTF-8 encoded string */
PyObject *globals, PyObject *globals,

View file

@ -134,7 +134,7 @@ class ImportTests(unittest.TestCase):
# CRASHES importmodule(NULL) # CRASHES importmodule(NULL)
def test_importmodulenoblock(self): def test_importmodulenoblock(self):
# Test deprecated PyImport_ImportModuleNoBlock() # Test deprecated (stable ABI only) PyImport_ImportModuleNoBlock()
importmodulenoblock = _testlimitedcapi.PyImport_ImportModuleNoBlock importmodulenoblock = _testlimitedcapi.PyImport_ImportModuleNoBlock
with check_warnings(('', DeprecationWarning)): with check_warnings(('', DeprecationWarning)):
self.check_import_func(importmodulenoblock) self.check_import_func(importmodulenoblock)

View file

@ -1161,7 +1161,7 @@ no-op now.
.. nonce: Lq2_gR .. nonce: Lq2_gR
.. section: C API .. section: C API
Replaced deprecated usage of :c:func:`PyImport_ImportModuleNoBlock` with Replaced deprecated usage of :c:func:`!PyImport_ImportModuleNoBlock` with
:c:func:`PyImport_ImportModule` in stdlib modules. Patch by Kumar Aditya. :c:func:`PyImport_ImportModule` in stdlib modules. Patch by Kumar Aditya.
.. ..

View file

@ -6538,7 +6538,7 @@ to hide implementation details. Patch by Victor Stinner.
.. nonce: FQJG5B .. nonce: FQJG5B
.. section: C API .. section: C API
Deprecate the :c:func:`PyImport_ImportModuleNoBlock` function which is just Deprecate the :c:func:`!PyImport_ImportModuleNoBlock` function which is just
an alias to :c:func:`PyImport_ImportModule` since Python 3.3. Patch by an alias to :c:func:`PyImport_ImportModule` since Python 3.3. Patch by
Victor Stinner. Victor Stinner.

View file

@ -0,0 +1,2 @@
Remove deprecated alias :c:func:`!PyImport_ImportModuleNoBlock` of
:c:func:`PyImport_ImportModule`. Patch by Bénédikt Tran.

View file

@ -888,6 +888,7 @@
added = '3.2' added = '3.2'
[function.PyImport_ImportModuleNoBlock] [function.PyImport_ImportModuleNoBlock]
added = '3.2' added = '3.2'
abi_only = true
[function.PyImport_ReloadModule] [function.PyImport_ReloadModule]
added = '3.2' added = '3.2'
[function.PyInterpreterState_Clear] [function.PyInterpreterState_Clear]

View file

@ -108,20 +108,19 @@ pyimport_importmodule(PyObject *Py_UNUSED(module), PyObject *args)
} }
/* Test PyImport_ImportModuleNoBlock() */ /* Test PyImport_ImportModuleNoBlock() (removed in 3.15) */
static PyObject * static PyObject *
pyimport_importmodulenoblock(PyObject *Py_UNUSED(module), PyObject *args) pyimport_importmodulenoblock(PyObject *Py_UNUSED(module), PyObject *args)
{ {
// Get the function from the stable ABI.
PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock(const char *name);
const char *name; const char *name;
Py_ssize_t size; Py_ssize_t size;
if (!PyArg_ParseTuple(args, "z#", &name, &size)) { if (!PyArg_ParseTuple(args, "z#", &name, &size)) {
return NULL; return NULL;
} }
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
return PyImport_ImportModuleNoBlock(name); return PyImport_ImportModuleNoBlock(name);
_Py_COMP_DIAG_POP
} }

View file

@ -3434,8 +3434,10 @@ PyImport_ImportModule(const char *name)
* ImportError instead of blocking. * ImportError instead of blocking.
* *
* Returns the module object with incremented ref count. * Returns the module object with incremented ref count.
*
* Removed in 3.15, but kept for stable ABI compatibility.
*/ */
PyObject * PyAPI_FUNC(PyObject *)
PyImport_ImportModuleNoBlock(const char *name) PyImport_ImportModuleNoBlock(const char *name)
{ {
if (PyErr_WarnEx(PyExc_DeprecationWarning, if (PyErr_WarnEx(PyExc_DeprecationWarning,