]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-90092: Fix test_curses when stdin is write-only (e.g. under nohup) (GH-153420)
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 9 Jul 2026 15:43:26 +0000 (18:43 +0300)
committerGitHub <noreply@github.com>
Thu, 9 Jul 2026 15:43:26 +0000 (15:43 +0000)
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 <noreply@anthropic.com>
Lib/test/test_curses.py

index f54c9a62d5033e6cf6352bbe09ccc2620e87e71f..870393be5209df045e0142c81bd754101c867f3c 100644 (file)
@@ -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)