Run-time failure on FreeBSD: NotImplementedError: unsupported platform
When both wandb and eventlet packages are installed 'import wandb' fails in the trio code:
$ python3.11
Python 3.11.9 (main, Jul 11 2024, 01:05:32) [Clang 16.0.6 (https://github.com/llvm/llvm-project.git llvmorg-16.0.6-0-g7cbf1a on freebsd14
Type "help", "copyright", "credits" or "license" for more information.
>>> import wandb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.11/site-packages/wandb/__init__.py", line 20, in <module>
from wandb import sdk as wandb_sdk
File "/usr/local/lib/python3.11/site-packages/wandb/sdk/__init__.py", line 28, in <module>
from .wandb_init import _attach, init
File "/usr/local/lib/python3.11/site-packages/wandb/sdk/wandb_init.py", line 32, in <module>
from . import wandb_login, wandb_setup
File "/usr/local/lib/python3.11/site-packages/wandb/sdk/wandb_login.py", line 25, in <module>
from .wandb_settings import Settings
File "/usr/local/lib/python3.11/site-packages/wandb/sdk/wandb_settings.py", line 45, in <module>
from wandb.sdk.internal.system.env_probe_helpers import is_aws_lambda
File "/usr/local/lib/python3.11/site-packages/wandb/sdk/internal/system/env_probe_helpers.py", line 3, in <module>
from sentry_sdk.integrations.aws_lambda import get_lambda_bootstrap # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/sentry_sdk/__init__.py", line 1, in <module>
from sentry_sdk.hub import Hub, init
File "/usr/local/lib/python3.11/site-packages/sentry_sdk/hub.py", line 9, in <module>
from sentry_sdk.scope import Scope
File "/usr/local/lib/python3.11/site-packages/sentry_sdk/scope.py", line 7, in <module>
from sentry_sdk.utils import logger, capture_internal_exceptions
File "/usr/local/lib/python3.11/site-packages/sentry_sdk/utils.py", line 1048, in <module>
HAS_REAL_CONTEXTVARS, ContextVar = _get_contextvars()
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/sentry_sdk/utils.py", line 1018, in _get_contextvars
if not _is_contextvars_broken():
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/sentry_sdk/utils.py", line 979, in _is_contextvars_broken
from eventlet.patcher import is_monkey_patched # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/eventlet/__init__.py", line 6, in <module>
from eventlet import convenience
File "/usr/local/lib/python3.11/site-packages/eventlet/convenience.py", line 7, in <module>
from eventlet.green import socket
File "/usr/local/lib/python3.11/site-packages/eventlet/green/socket.py", line 21, in <module>
from eventlet.support import greendns
File "/usr/local/lib/python3.11/site-packages/eventlet/support/greendns.py", line 78, in <module>
setattr(dns, pkg, import_patched('dns.' + pkg))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/eventlet/support/greendns.py", line 60, in import_patched
return patcher.import_patched(module_name, **modules)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/eventlet/patcher.py", line 132, in import_patched
return inject(
^^^^^^^
File "/usr/local/lib/python3.11/site-packages/eventlet/patcher.py", line 109, in inject
module = __import__(module_name, {}, {}, module_name.split('.')[:-1])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/dns/asyncquery.py", line 32, in <module>
import dns.quic
File "/usr/local/lib/python3.11/site-packages/dns/quic/__init__.py", line 37, in <module>
import trio
File "/usr/local/lib/python3.11/site-packages/trio/__init__.py", line 23, in <module>
from ._core import TASK_STATUS_IGNORED as TASK_STATUS_IGNORED # isort: split
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/trio/_core/__init__.py", line 21, in <module>
from ._local import RunVar, RunVarToken
File "/usr/local/lib/python3.11/site-packages/trio/_core/_local.py", line 9, in <module>
from . import _run
File "/usr/local/lib/python3.11/site-packages/trio/_core/_run.py", line 2844, in <module>
raise NotImplementedError("unsupported platform")
NotImplementedError: unsupported platform
The conditional in this line:
elif TYPE_CHECKING or hasattr(select, "kqueue"):
always evaluates to False because TYPE_CHECKING is always False at run-time.
Otherwise hasattr(select, "kqueue") evaluates to True.
Version: 0.26.2 Python-3.11 FreeBSD 14.1
hasattr(select, "kqueue") must be False for that to be False fwiw
When I run it separately, hasattr(select, "kqueue") evaluates to True.
I don't know how can that be.
Yeah, because eventlet patches out select.kqueue. If you import trio first things should work... we should probably make the error message better.
It shouldn't fail like this. This failure is very obscure. I accidentally caught this while testing wandb after having other things installed by something else.
Would this as an error message work better?: "unsupported platform or the IO primitives trio relies on are patched out" if either eventlet or gevent are detected in sys.modules?
I guess this error message is okay.
The real problem seems to lie in the eventlet package. It fails like this on import.
This is because eventlet does some nasty monkeypatching stuff and replaces signal handlers with its own
any update for this? It all of a sudden pops up as an issue
No update because it's not something we can really solve. The error message is better at least?
(I guess if we felt like it we could implement an event manager based on gevent but that sounds painful :^)