dota2tuned / sitecustomize.py
Dracufeuer's picture
fix(space): stabilize runtime
ccd0d9f verified
Raw
History Blame Contribute Delete
2.53 kB
"""Process startup tweaks for the Hugging Face Space runtime.
Python imports this module automatically during interpreter startup when the
repository root is on sys.path. Keep it stdlib-only: it must run before Gradio
or the project package is imported.
"""
from __future__ import annotations
import asyncio
import sys
import traceback
import warnings
_STARLETTE_422_DEPRECATION_PATTERN = (
r"'HTTP_422_UNPROCESSABLE_ENTITY' is deprecated\. "
r"Use 'HTTP_422_UNPROCESSABLE_CONTENT' instead\."
)
def _is_benign_loop_teardown(unraisable) -> bool:
exc = getattr(unraisable, "exc_value", None)
if not isinstance(exc, ValueError) or "Invalid file descriptor" not in str(exc):
return False
obj = getattr(unraisable, "object", None)
qualname = getattr(obj, "__qualname__", "") or ""
if "BaseEventLoop.__del__" in qualname:
return True
tb = getattr(unraisable, "exc_traceback", None)
frames = traceback.extract_tb(tb) if tb else []
return any(
frame.filename.endswith(
(
"asyncio/base_events.py",
"asyncio/unix_events.py",
"asyncio/selector_events.py",
"selectors.py",
)
)
for frame in frames
)
def _install_quiet_unraisablehook() -> None:
_install_quiet_starlette_422_warning()
_install_safe_asyncio_loop_del()
if getattr(sys.unraisablehook, "_dota2tuned_quiet_unraisablehook", False):
return
previous_hook = sys.unraisablehook
def hook(unraisable):
if _is_benign_loop_teardown(unraisable):
return
previous_hook(unraisable)
hook._dota2tuned_quiet_unraisablehook = True
sys.unraisablehook = hook
def _install_safe_asyncio_loop_del() -> None:
current_del = asyncio.BaseEventLoop.__del__
if getattr(current_del, "_dota2tuned_safe_loop_del", False):
return
original_del = current_del
def safe_loop_del(self):
try:
original_del(self)
except ValueError as exc:
if "Invalid file descriptor" in str(exc):
return
raise
safe_loop_del._dota2tuned_safe_loop_del = True
safe_loop_del._dota2tuned_original_loop_del = original_del
asyncio.BaseEventLoop.__del__ = safe_loop_del
def _install_quiet_starlette_422_warning() -> None:
warnings.filterwarnings(
"ignore",
message=_STARLETTE_422_DEPRECATION_PATTERN,
category=Warning,
)
_install_quiet_unraisablehook()