From c49cc2a2b19642bcb3f7c82cad26954e8d4f99c6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Jul 2026 15:24:06 +0300 Subject: [PATCH] gh-90092: Fix test_curses when stdin is write-only (e.g. under nohup) newterm() needs a readable input fd, but nohup can leave stdin write-only. Fall back to the output fd, as already done when stdin has no fileno. Co-Authored-By: Claude Opus 4.8 --- Lib/test/test_curses.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index f54c9a62d5033e..870393be5209df 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -29,6 +29,9 @@ except ImportError: pass +# Only reachable once curses imported, so the platform has fcntl too. +import fcntl + def requires_curses_func(name): return unittest.skipUnless(hasattr(curses, name), 'requires curses.%s' % name) @@ -164,6 +167,10 @@ def setUp(self): # ScreenTests run newterm()/set_term() in the same process. try: infd = sys.__stdin__.fileno() + if fcntl.fcntl(infd, fcntl.F_GETFL) & os.O_ACCMODE == os.O_WRONLY: + # newterm() needs a readable input fd; a write-only stdin + # (as nohup leaves for a backgrounded run) fails with EINVAL. + infd = stdout_fd except (AttributeError, ValueError, OSError): infd = stdout_fd self.screen = curses.newterm(term, stdout_fd, infd)