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 <[email protected]>
This commit is contained in:
Serhiy Storchaka
2026-07-09 15:43:26 +00:00
committed by GitHub
co-authored by Claude Opus 4.8
parent dd8739a35b
commit eacb85a2b2
+7
View 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)