Commit 0e48b3e
fix(server): don't close real process stdio in stdio_server (#1933)
stdio_server re-wraps sys.stdin.buffer/sys.stdout.buffer in a TextIOWrapper
to force UTF-8. The wrapper's __del__ finalizer closes the buffer it wraps, so
once the wrapper is garbage-collected the real sys.stdin/sys.stdout is closed
and any code that runs after the server exits raises
"ValueError: I/O operation on closed file." on print() or a stdout write.
Dup the underlying fd (os.dup, Windows-safe) and wrap the copy, so the wrapper
only ever closes the duplicate; close those wrappers on exit to free the dup'd
fds. When sys.std* has no real fd (pytest capture, embedded interpreters,
injected in-memory streams) fall back to wrapping .buffer and detach() the
wrapper on exit, which severs it from the buffer without closing it so the
finalizer can no longer close the real handle either.
Adds a regression test asserting the real stdin/stdout buffers survive after
the transport exits.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent 1216c53 commit 0e48b3e
2 files changed
Lines changed: 91 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| 20 | + | |
| 21 | + | |
20 | 22 | | |
21 | 23 | | |
22 | 24 | | |
| 25 | + | |
23 | 26 | | |
24 | 27 | | |
25 | 28 | | |
| |||
34 | 37 | | |
35 | 38 | | |
36 | 39 | | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
41 | 69 | | |
42 | | - | |
| 70 | + | |
43 | 71 | | |
44 | | - | |
| 72 | + | |
45 | 73 | | |
46 | 74 | | |
47 | 75 | | |
| |||
71 | 99 | | |
72 | 100 | | |
73 | 101 | | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
| 4 | + | |
3 | 5 | | |
4 | 6 | | |
5 | 7 | | |
| |||
75 | 77 | | |
76 | 78 | | |
77 | 79 | | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
78 | 121 | | |
79 | 122 | | |
80 | 123 | | |
| |||
0 commit comments