β I'm submitting a ...
π Describe the bug. What is the current behavior?
And one more failure with Python 3.13: when running cheroot/test/test_conn.py, I am seeing one of the tests fail with the following error:
E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function IOBase.__del__ at 0x1ffd0ae81cea20>
E
E Traceback (most recent call last):
E File "/usr/lib/python3.13/_pyio.py", line 418, in __del__
E self.close()
E ~~~~~~~~~~^^
E File "/usr/lib/python3.13/_pyio.py", line 1313, in close
E self.flush()
E ~~~~~~~~~~^^
E File "/usr/lib/python3.13/_pyio.py", line 1274, in flush
E self._flush_unlocked()
E ~~~~~~~~~~~~~~~~~~~~^^
E File "/scratch/userland-gate/components/python/cheroot/cheroot-10.0.0/cheroot/makefile.py", line 33, in _flush_unlocked
E n = self.raw.write(bytes(self._write_buf))
E File "/usr/lib/python3.13/socket.py", line 737, in write
E return self._sock.send(b)
E ~~~~~~~~~~~~~~~^^^
E OSError: [Errno 9] Bad file number
I saw the following three fail: test_streaming_10[True], test_keepalive[HTTP/1.0], test_keepalive[HTTP/1.1] with this error, although it's always just one for each run (and it seems random).
This again seems to be related to the following io change:
https://docs.python.org/3/whatsnew/3.13.html#io
I wasn't able to find a fix for this one.
π‘ To Reproduce
Run the test suite with Python 3.13.0.
π Details
Full traceback:
==================================== ERRORS ====================================
__________________ ERROR at setup of test_keepalive[HTTP/1.0] __________________
cls = <class '_pytest.runner.CallInfo'>
func = <function call_and_report.<locals>.<lambda> at 0x1fffe71a7c2020>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)
@classmethod
def from_call(
cls,
func: Callable[[], TResult],
when: Literal["collect", "setup", "call", "teardown"],
reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None,
) -> CallInfo[TResult]:
"""Call func, wrapping the result in a CallInfo.
:param func:
The function to call. Called without arguments.
:type func: Callable[[], _pytest.runner.TResult]
:param when:
The phase in which the function is called.
:param reraise:
Exception or exceptions that shall propagate if raised by the
function, instead of being wrapped in the CallInfo.
"""
excinfo = None
start = timing.time()
precise_start = timing.perf_counter()
try:
> result: TResult | None = func()
cls = <class '_pytest.runner.CallInfo'>
duration = 0.10653769504278898
excinfo = <ExceptionInfo PytestUnraisableExceptionWarning('Exception ignored in: <function IOBase.__del__ at 0x1fffe71f1cea20>\n...in write\n return self._sock.send(b)\n ~~~~~~~~~~~~~~~^^^\nOSError: [Errno 9] Bad file number\n') tblen=8>
func = <function call_and_report.<locals>.<lambda> at 0x1fffe71a7c2020>
precise_start = 7332079.8773448
precise_stop = 7332079.983882495
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)
result = None
start = 1730815279.3573403
stop = 1730815279.463881
when = 'setup'
/usr/lib/python3.13/vendor-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.13/vendor-packages/_pytest/runner.py:242: in <lambda>
lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
item = <Function test_keepalive[HTTP/1.0]>
kwds = {}
runtest_hook = <HookCaller 'pytest_runtest_setup'>
/usr/lib/python3.13/vendor-packages/pluggy/_hooks.py:513: in __call__
return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
firstresult = False
kwargs = {'item': <Function test_keepalive[HTTP/1.0]>}
self = <HookCaller 'pytest_runtest_setup'>
/usr/lib/python3.13/vendor-packages/pluggy/_manager.py:120: in _hookexec
return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
firstresult = False
hook_name = 'pytest_runtest_setup'
kwargs = {'item': <Function test_keepalive[HTTP/1.0]>}
methods = [<HookImpl plugin_name='runner', plugin=<module '_pytest.runner' from '/usr/lib/python3.13/vendor-packages/_pytest/run...ugin=<module '_pytest.unraisableexception' from '/usr/lib/python3.13/vendor-packages/_pytest/unraisableexception.py'>>]
self = <_pytest.config.PytestPluginManager object at 0x1fffe72020c590>
/usr/lib/python3.13/vendor-packages/_pytest/unraisableexception.py:90: in pytest_runtest_setup
yield from unraisable_exception_runtest_hook()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
def unraisable_exception_runtest_hook() -> Generator[None]:
with catch_unraisable_exception() as cm:
try:
yield
finally:
if cm.unraisable:
if cm.unraisable.err_msg is not None:
err_msg = cm.unraisable.err_msg
else:
err_msg = "Exception ignored in"
msg = f"{err_msg}: {cm.unraisable.object!r}\n\n"
msg += "".join(
traceback.format_exception(
cm.unraisable.exc_type,
cm.unraisable.exc_value,
cm.unraisable.exc_traceback,
)
)
> warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function IOBase.__del__ at 0x1fffe71f1cea20>
E
E Traceback (most recent call last):
E File "/usr/lib/python3.13/_pyio.py", line 418, in __del__
E self.close()
E ~~~~~~~~~~^^
E File "/usr/lib/python3.13/_pyio.py", line 1313, in close
E self.flush()
E ~~~~~~~~~~^^
E File "/usr/lib/python3.13/_pyio.py", line 1274, in flush
E self._flush_unlocked()
E ~~~~~~~~~~~~~~~~~~~~^^
E File "/scratch/userland-gate/components/python/cheroot/cheroot-10.0.0/cheroot/makefile.py", line 33, in _flush_unlocked
E n = self.raw.write(bytes(self._write_buf))
E File "/usr/lib/python3.13/socket.py", line 737, in write
E return self._sock.send(b)
E ~~~~~~~~~~~~~~~^^^
E OSError: [Errno 9] Bad file number
cm = <_pytest.unraisableexception.catch_unraisable_exception object at 0x1fffe71f1de090>
err_msg = 'Exception ignored in'
msg = 'Exception ignored in: <function IOBase.__del__ at 0x1fffe71f1cea20>\n\nTraceback (most recent call last):\n File "/u...line 737, in write\n return self._sock.send(b)\n ~~~~~~~~~~~~~~~^^^\nOSError: [Errno 9] Bad file number\n'
π Environment
- Cheroot version: tested with 10.0.0 and 11.0.0b3
- Python version: 3.13.0
- OS: Oracle Solaris (but this doesn't seem to be platform dependent)
β I'm submitting a ...
π Describe the bug. What is the current behavior?
And one more failure with Python 3.13: when running
cheroot/test/test_conn.py, I am seeing one of the tests fail with the following error:I saw the following three fail:
test_streaming_10[True],test_keepalive[HTTP/1.0],test_keepalive[HTTP/1.1]with this error, although it's always just one for each run (and it seems random).This again seems to be related to the following io change:
https://docs.python.org/3/whatsnew/3.13.html#io
I wasn't able to find a fix for this one.
π‘ To Reproduce
Run the test suite with Python 3.13.0.
π Details
Full traceback:
==================================== ERRORS ==================================== __________________ ERROR at setup of test_keepalive[HTTP/1.0] __________________ cls = <class '_pytest.runner.CallInfo'> func = <function call_and_report.<locals>.<lambda> at 0x1fffe71a7c2020> when = 'setup' reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None start = timing.time() precise_start = timing.perf_counter() try: > result: TResult | None = func() cls = <class '_pytest.runner.CallInfo'> duration = 0.10653769504278898 excinfo = <ExceptionInfo PytestUnraisableExceptionWarning('Exception ignored in: <function IOBase.__del__ at 0x1fffe71f1cea20>\n...in write\n return self._sock.send(b)\n ~~~~~~~~~~~~~~~^^^\nOSError: [Errno 9] Bad file number\n') tblen=8> func = <function call_and_report.<locals>.<lambda> at 0x1fffe71a7c2020> precise_start = 7332079.8773448 precise_stop = 7332079.983882495 reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>) result = None start = 1730815279.3573403 stop = 1730815279.463881 when = 'setup' /usr/lib/python3.13/vendor-packages/_pytest/runner.py:341: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.13/vendor-packages/_pytest/runner.py:242: in <lambda> lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise item = <Function test_keepalive[HTTP/1.0]> kwds = {} runtest_hook = <HookCaller 'pytest_runtest_setup'> /usr/lib/python3.13/vendor-packages/pluggy/_hooks.py:513: in __call__ return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) firstresult = False kwargs = {'item': <Function test_keepalive[HTTP/1.0]>} self = <HookCaller 'pytest_runtest_setup'> /usr/lib/python3.13/vendor-packages/pluggy/_manager.py:120: in _hookexec return self._inner_hookexec(hook_name, methods, kwargs, firstresult) firstresult = False hook_name = 'pytest_runtest_setup' kwargs = {'item': <Function test_keepalive[HTTP/1.0]>} methods = [<HookImpl plugin_name='runner', plugin=<module '_pytest.runner' from '/usr/lib/python3.13/vendor-packages/_pytest/run...ugin=<module '_pytest.unraisableexception' from '/usr/lib/python3.13/vendor-packages/_pytest/unraisableexception.py'>>] self = <_pytest.config.PytestPluginManager object at 0x1fffe72020c590> /usr/lib/python3.13/vendor-packages/_pytest/unraisableexception.py:90: in pytest_runtest_setup yield from unraisable_exception_runtest_hook() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def unraisable_exception_runtest_hook() -> Generator[None]: with catch_unraisable_exception() as cm: try: yield finally: if cm.unraisable: if cm.unraisable.err_msg is not None: err_msg = cm.unraisable.err_msg else: err_msg = "Exception ignored in" msg = f"{err_msg}: {cm.unraisable.object!r}\n\n" msg += "".join( traceback.format_exception( cm.unraisable.exc_type, cm.unraisable.exc_value, cm.unraisable.exc_traceback, ) ) > warnings.warn(pytest.PytestUnraisableExceptionWarning(msg)) E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function IOBase.__del__ at 0x1fffe71f1cea20> E E Traceback (most recent call last): E File "/usr/lib/python3.13/_pyio.py", line 418, in __del__ E self.close() E ~~~~~~~~~~^^ E File "/usr/lib/python3.13/_pyio.py", line 1313, in close E self.flush() E ~~~~~~~~~~^^ E File "/usr/lib/python3.13/_pyio.py", line 1274, in flush E self._flush_unlocked() E ~~~~~~~~~~~~~~~~~~~~^^ E File "/scratch/userland-gate/components/python/cheroot/cheroot-10.0.0/cheroot/makefile.py", line 33, in _flush_unlocked E n = self.raw.write(bytes(self._write_buf)) E File "/usr/lib/python3.13/socket.py", line 737, in write E return self._sock.send(b) E ~~~~~~~~~~~~~~~^^^ E OSError: [Errno 9] Bad file number cm = <_pytest.unraisableexception.catch_unraisable_exception object at 0x1fffe71f1de090> err_msg = 'Exception ignored in' msg = 'Exception ignored in: <function IOBase.__del__ at 0x1fffe71f1cea20>\n\nTraceback (most recent call last):\n File "/u...line 737, in write\n return self._sock.send(b)\n ~~~~~~~~~~~~~~~^^^\nOSError: [Errno 9] Bad file number\n'π Environment