python-build-standalone icon indicating copy to clipboard operation
python-build-standalone copied to clipboard

musl builds don't work with pyroute2

Open MeitarR opened this issue 1 month ago • 3 comments

The title may be problems with RTNL in musl builds, but I don't know if it's accurate yet.

What I'm experiencing is that every usage I have with pyroute2.IPRoute() never returns (only on musl builds).

➜  ~ docker run --rm -it python:3.12-alpine /bin/sh -c "pip install uv; uvx --managed-python --with pyroute2 python -c \"import pyroute2; ipr = pyroute2.IPRoute(); [print(link['index']) for link in ipr.get_links()]\""
Collecting uv
  Downloading uv-0.9.18-py3-none-musllinux_1_1_x86_64.whl.metadata (11 kB)
Downloading uv-0.9.18-py3-none-musllinux_1_1_x86_64.whl (22.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.4/22.4 MB 13.2 MB/s eta 0:00:00
Installing collected packages: uv
Successfully installed uv-0.9.18
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.

[notice] A new release of pip is available: 25.0.1 -> 25.3
[notice] To update, run: pip install --upgrade pip
Installed 1 package in 35ms

If I CTRL+C, this is the error I get (notice the OSError: getsockaddrlen: bad family, may be a lead)

^CTraceback (most recent call last):
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/selector_events.py", line 1245, in _read_ready
    data, addr = self._sock.recvfrom(self.max_size)
                 ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
OSError: getsockaddrlen: bad family

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import pyroute2; ipr = pyroute2.IPRoute(); [print(link['index']) for link in ipr.get_links()]
                                                                                 ~~~~~~~~~~~~~^^
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/iproute/linux.py", line 2748, in _run_force_sync
    return tuple(self._generate_with_cleanup(func, *argv, **kwarg))
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/netlink/core.py", line 792, in _generate_with_cleanup
    for item in RequestWrapper(
                ~~~~~~~~~~~~~~^
        event_loop=self.asyncore.event_loop,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        func=func(*argv, **kwarg),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
    ):
    ^
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/netlink/core.py", line 198, in __next__
    return self.event_loop.run_until_complete(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        self.response.__anext__()
        ^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/base_events.py", line 706, in run_until_complete
    self.run_forever()
    ~~~~~~~~~~~~~~~~^^
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/base_events.py", line 677, in run_forever
    self._run_once()
    ~~~~~~~~~~~~~~^^
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/base_events.py", line 2046, in _run_once
    handle._run()
    ~~~~~~~~~~~^^
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/events.py", line 94, in _run
    self._context.run(self._callback, *self._args)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/selector_events.py", line 1249, in _read_ready
    self._protocol.error_received(exc)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/netlink/core.py", line 167, in error_received
    def error_received(self, exc: OSError) -> None:

KeyboardInterrupt
Exception ignored while closing generator <async_generator object NetlinkRequest.response at 0x7f614a3eb340>:
Traceback (most recent call last):
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/netlink/nlsocket.py", line 664, in response
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/netlink/core.py", line 547, in get
  File "/root/.cache/uv/archive-v0/4sSXxb9NmNI_TZ81_5wE8/lib/python3.14/site-packages/pyroute2/netlink/core.py", line 121, in get
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/queues.py", line 188, in get
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/base_events.py", line 827, in call_soon
  File "/root/.local/share/uv/python/cpython-3.14.2-linux-x86_64-musl/lib/python3.14/asyncio/base_events.py", line 550, in _check_closed
RuntimeError: Event loop is closed

proof that it's a problem only with the musl builds here:

works fine with Python that was not built from this repo on musl

➜  ~ docker run --rm -it python:3.12-alpine /bin/sh -c "pip install uv; uvx --no-managed-python --with pyroute2 python -c \"import pyroute2; ipr = pyroute2.IPRoute(); [print(link['index']) for link in ipr.get_links()]\""
Collecting uv
  Downloading uv-0.9.18-py3-none-musllinux_1_1_x86_64.whl.metadata (11 kB)
Downloading uv-0.9.18-py3-none-musllinux_1_1_x86_64.whl (22.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.4/22.4 MB 12.4 MB/s eta 0:00:00
Installing collected packages: uv
Successfully installed uv-0.9.18
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.

[notice] A new release of pip is available: 25.0.1 -> 25.3
[notice] To update, run: pip install --upgrade pip
Installed 1 package in 39ms
1
51

works with Python that was built from this repo, but for glibc instead of musl

➜  ~ docker run --rm -it python:3.12-slim-bookworm /bin/sh -c "pip install uv; uvx --managed-python --with pyroute2 python -c \"import pyroute2; ipr = pyroute2.IPRoute(); [print(link['index']) for link in ipr.get_links()]\""
Collecting uv
  Downloading uv-0.9.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)
Downloading uv-0.9.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (22.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.2/22.2 MB 8.4 MB/s eta 0:00:00
Installing collected packages: uv
Successfully installed uv-0.9.18
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.

[notice] A new release of pip is available: 25.0.1 -> 25.3
[notice] To update, run: pip install --upgrade pip
Installed 1 package in 39ms
1
53

MeitarR avatar Dec 20 '25 10:12 MeitarR