Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[BUG] autobahn/__init__.py eagerly imports flatbuffers → numpy is loaded in every process (regression after 24.4.2)

Abierto
#1,983 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
58/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
numpy, python

Línea de trabajo

Start by reading autobahn/__init__.py and trace its import of flatbuffers to flatbuffers/number_types.py, where NumPy is loaded at module scope. Compare that import path with the 24.4.2 behavior described in the issue, then check the existing tests around package imports and NumPy compatibility. Done means importing Autobahn without using FlatBuffers does not load NumPy, and a broken NumPy installation does not prevent importing Autobahn.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Summary

Since some release after 24.4.2, import autobahn imports the vendored flatbuffers
package at module-import time, and flatbuffers imports numpy whenever numpy
happens to be installed. Users who never touch WAMP or FlatBuffers now pay for numpy
in every process.

This reaches well beyond autobahn itself: daphne imports autobahn.twisted.websocket
from its Django AppConfig, so every Django + Channels project that has numpy
anywhere in its environment
now loads numpy at django.setup() — web workers,
Celery workers, beat, management commands.

Import chain

daphne/apps.py:6                           import daphne.server
daphne/server.py:42
daphne/ws_protocol.py:6                    from autobahn.twisted.websocket import ...
autobahn/__init__.py:35                    from autobahn import flatbuffers
autobahn/flatbuffers/__init__.py:15        from . import util
autobahn/flatbuffers/util.py:15            from . import encode
autobahn/flatbuffers/encode.py:15          from . import number_types as N
autobahn/flatbuffers/number_types.py:21    np = import_numpy()
autobahn/flatbuffers/compat.py:75          import numpy as np

Two independent things combine here:

  1. autobahn/__init__.py gained an unconditional from autobahn import flatbuffers
    (it appears to serve check_zlmdb_flatbuffers_version_in_sync()). In 24.4.2 that
    module imported only _version, os and txaio.
  2. flatbuffers/number_types.py calls import_numpy() at module level, and
    compat.import_numpy() imports numpy whenever PathFinder.find_spec("numpy")
    succeeds — i.e. "numpy is installed" is treated as "numpy should be loaded".

Impact 1 — memory, for users who never use FlatBuffers

Measured with resource.getrusage(...).ru_maxrss on Python 3.13.13 / numpy 2.4.6
(macOS arm64):

process RSS
bare interpreter 16.4 MB
import txaio (what 24.4.2 pulled in) 16.3 MB
import numpy 29.4 MB

That is roughly +13 MB per process, multiplied by however many workers a
deployment runs. For a Django deployment with web + Celery + beat + a few
background workers this is a noticeable, invisible regression: nothing in the
application asks for numpy.

Impact 2 — a broken numpy now prevents importing autobahn at all

import_numpy() imports numpy deliberately outside try/except, with the comment
"We do this outside of try/except block in case numpy exists but is not installed
correctly". Combined with the eager import in __init__.py, a numpy whose import
fails — for example an ABI mismatch of the kind described in #1890 — makes
autobahn itself unimportable, and with it daphne and the whole Django app.

Reproducer for that failure mode:

import sys

class Block:
    def find_spec(self, name, path=None, target=None):
        if name == "numpy":
            raise ImportError("simulating a broken numpy install")
        return None

sys.meta_path.insert(0, Block())
import autobahn.twisted.websocket   # ImportError, raised from autobahn/__init__.py:35

Reproducer showing the import chain itself:

import sys, traceback

class Hook:
    def find_spec(self, name, path=None, target=None):
        if name == "numpy":
            traceback.print_stack()
            sys.meta_path.remove(self)
        return None

sys.meta_path.insert(0, Hook())
import autobahn.twisted.websocket
print("numpy" in sys.modules)   # True

Suggested fixes

Any one of these removes the cost for users who do not use FlatBuffers:

  1. Move from autobahn import flatbuffers inside
    check_zlmdb_flatbuffers_version_in_sync() (or behind a lazy accessor), so that
    importing autobahn does not import the serializer.
  2. Resolve numpy lazily in number_types.py instead of at module-import time.
  3. At minimum, wrap the numpy import in try/except ImportError, so a broken numpy
    degrades to "FlatBuffers numpy features unavailable" instead of
    "autobahn cannot be imported".

Options 1 and 2 are independent and either alone fixes the memory issue; 3 addresses
the robustness issue.

Environment

autobahn 26.7.1, daphne 4.2.2, numpy 2.4.6, Python 3.13.13, macOS arm64.

Noticed while upgrading autobahn to 26.7.1 for CVE-2026-77528: a guard test asserting
that numpy is absent from the Django setup import graph started failing.

Lenguaje dominante
Python
Estrellas
2.5k
Forks
769
Merge medio
1 d 12 h
PR fusionados (30 d)
15

Preparar el entorno

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.

Más de crossbario/autobahn-python

Todos los issues de crossbario/autobahn-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.