remember stderr fileno in config.stash to be restored on faulthandler teardown

This commit is contained in:
Simon Blanchard 2023-11-03 21:37:10 +01:00
parent 13e5ef0102
commit e340a075e5
2 changed files with 10 additions and 2 deletions

View File

@ -0,0 +1 @@
Handle an edge case where :data:`sys.stderr` and :data:`sys.__stderr__` might already be closed when :ref:`faulthandler` is tearing down.

View File

@ -9,6 +9,7 @@ from _pytest.nodes import Item
from _pytest.stash import StashKey from _pytest.stash import StashKey
fault_handler_original_stderr_fd_key = StashKey[int]()
fault_handler_stderr_fd_key = StashKey[int]() fault_handler_stderr_fd_key = StashKey[int]()
fault_handler_originally_enabled_key = StashKey[bool]() fault_handler_originally_enabled_key = StashKey[bool]()
@ -24,7 +25,9 @@ def pytest_addoption(parser: Parser) -> None:
def pytest_configure(config: Config) -> None: def pytest_configure(config: Config) -> None:
import faulthandler import faulthandler
config.stash[fault_handler_stderr_fd_key] = os.dup(get_stderr_fileno()) stderr_fileno = get_stderr_fileno()
config.stash[fault_handler_original_stderr_fd_key] = stderr_fileno
config.stash[fault_handler_stderr_fd_key] = os.dup(stderr_fileno)
config.stash[fault_handler_originally_enabled_key] = faulthandler.is_enabled() config.stash[fault_handler_originally_enabled_key] = faulthandler.is_enabled()
faulthandler.enable(file=config.stash[fault_handler_stderr_fd_key]) faulthandler.enable(file=config.stash[fault_handler_stderr_fd_key])
@ -39,6 +42,10 @@ def pytest_unconfigure(config: Config) -> None:
del config.stash[fault_handler_stderr_fd_key] del config.stash[fault_handler_stderr_fd_key]
if config.stash.get(fault_handler_originally_enabled_key, False): if config.stash.get(fault_handler_originally_enabled_key, False):
# Re-enable the faulthandler if it was originally enabled. # Re-enable the faulthandler if it was originally enabled.
if fault_handler_original_stderr_fd_key in config.stash:
faulthandler.enable(config.stash[fault_handler_original_stderr_fd_key])
del config.stash[fault_handler_original_stderr_fd_key]
else:
faulthandler.enable(file=get_stderr_fileno()) faulthandler.enable(file=get_stderr_fileno())