Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python 3.13 breaks circular imports during single phase init of extension module #123880

Closed
hauntsaninja opened this issue Sep 9, 2024 · 0 comments
Labels
3.13 bugs and security fixes release-blocker type-bug An unexpected behavior, bug, or error

Comments

@hauntsaninja
Copy link
Contributor

hauntsaninja commented Sep 9, 2024

Here's a bash script to reproduce:

printf '
#define PY_SSIZE_T_CLEAN
#include <Python.h>

static struct PyModuleDef nativemodule = {
    PyModuleDef_HEAD_INIT,
    .m_name = "native",
};

PyObject* module = NULL;

PyMODINIT_FUNC PyInit_native(void) {
    if (module) {
        Py_INCREF(module);
        return module;
    }
    module = PyModule_Create(&nativemodule);
    assert(module);

    Py_XDECREF(PyImport_ImportModule("non_native"));
    PySys_WriteStdout("hello from native\\n");

    return module;
}
' > native.c

printf 'import native  # circular import' > non_native.py

printf '
from setuptools import setup, Extension

setup(name="native", ext_modules=[Extension("native", sources=["native.c"])])
' > setup.py

python setup.py build_ext --inplace

python -c 'import native'

This produces:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import native
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 921, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 819, in module_from_spec
  File "<frozen importlib._bootstrap>", line 782, in _init_module_attrs
SystemError: extension module 'native' is already cached

and an assertion failure in debug builds.

The new error comes from #118532 cc @ericsnowcurrently
It's unclear whether this breaking change is intentional, given no mention in documentation and the assert.

This affects the mypyc transpiler, see python/mypy#17748 for details and for an end-to-end repro. This means for instance that mypy and black cannot currently be compiled for Python 3.13. Changing mypyc to use multi-phase init is not an easy change because mypyc uses globals.

CPython versions tested on:

3.13

Operating systems tested on:

No response

Linked PRs

@hauntsaninja hauntsaninja added type-bug An unexpected behavior, bug, or error release-blocker labels Sep 9, 2024
@hauntsaninja hauntsaninja added the 3.13 bugs and security fixes label Sep 12, 2024
encukou added a commit that referenced this issue Sep 20, 2024
miss-islington pushed a commit to miss-islington/cpython that referenced this issue Sep 20, 2024
…ythonGH-123950)

(cherry picked from commit aee219f)

Co-authored-by: Petr Viktorin <[email protected]>
Co-authored-by: Shantanu <[email protected]>
Co-authored-by: Brett Cannon <[email protected]>
savannahostrowski pushed a commit to savannahostrowski/cpython that referenced this issue Sep 22, 2024
savannahostrowski pushed a commit to savannahostrowski/cpython that referenced this issue Sep 22, 2024
Yhg1s pushed a commit that referenced this issue Sep 23, 2024
…GH-123950) (#124273)

gh-123880: Allow recursive import of single-phase-init modules (GH-123950)

(cherry picked from commit aee219f)

Co-authored-by: Petr Viktorin <[email protected]>
Co-authored-by: Shantanu <[email protected]>
Co-authored-by: Brett Cannon <[email protected]>
@encukou encukou closed this as completed Sep 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.13 bugs and security fixes release-blocker type-bug An unexpected behavior, bug, or error
Projects
Development

No branches or pull requests

2 participants