From eacb85a2b2ee9212997ab451dc95ec3e7992afc8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Jul 2026 18:43:26 +0300 Subject: [PATCH] gh-90092: Fix test_curses when stdin is write-only (e.g. under nohup) (GH-153420) 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 f54c9a62d503..870393be5209 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -29,6 +29,9 @@ try: 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 @@ class TestCurses(unittest.TestCase): # 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) -- 2.47.3