python / python/cpython

Interpreter Methods For Main Interpreter Fail Unexpectedly

Abierto
#139,458 2 comentarios 0 reacciones 1 asignado Ver en GitHub

@ericsnowcurrently ya está trabajando en esto.

Desde el 30/9/2025.

3.14 3.15 stdlib topic-subinterpreters type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
36k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

Bug description:

The following should run without error:

import contextlib
from concurrent import interpreters

assert __name__ == '__main__'

DIV1 = 'v' * 40
DIV2 = '^' * 40

@contextlib.contextmanager
def dump_traceback():
    try:
        yield
    except Exception:
        import traceback
        print()
        print(DIV1)
        traceback.print_exc()
        print(DIV2)

# First try with the current interpreter.
interp0 = interpreters.get_current()
assert interp0 is interpreters.get_main()

# Interpreters "running main" cannot exec or call.
assert interp0.is_running
with dump_traceback():
    try:
        interp0.exec('None')
    except interpreters.InterpreterError as exc:
        if 'running main' not in str(exc):
            raise
with dump_traceback():
    try:
        interp0.call(print, 'spam!', flush=True)
    except interpreters.InterpreterError as exc:
        if 'running main' not in str(exc):
            raise

# prepare_main() should still work
assert 'spam' not in globals()
with dump_traceback():
    interp0.prepare_main(spam=11)
    assert spam == 11

# Try with a subinterpreter
interp1 = interpreters.create()

assert 'q' not in globals()
with dump_traceback():
    interp1.exec("""if True:
        from concurrent import interpreters
        q = interpreters.create_queue()
        interp0 = interpreters.get_main()
        interp0.prepare_main(q=q)
        q.put_nowait(42)
        """)
    assert 'q' in globals()
    val = q.pop()
    assert val == 42

Instead, the four different calls against interp0 raise InterpreterError with "cannot ... unrecognized interpreter 0". The calls to exec() and call() should fail with something like "running main". The call to prepare_main() should work. Whether prepare_main() should work or not is a separate matter. Regardless, the main interpreter should be recognized.

Note that interp0.is_running does work, as expected.

CPython versions tested on:

3.15, 3.14

Operating systems tested on:

No response

Linked PRs
  • gh-139521

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.