@@ -17,6 +17,7 @@ async def run_server():
1717 ```
1818"""
1919
20+ import os
2021import sys
2122from contextlib import asynccontextmanager
2223from io import TextIOWrapper
@@ -38,10 +39,16 @@ async def stdio_server(stdin: anyio.AsyncFile[str] | None = None, stdout: anyio.
3839 # standard process handles. Encoding of stdin/stdout as text streams on
3940 # python is platform-dependent (Windows is particularly problematic), so we
4041 # re-wrap the underlying binary stream to ensure UTF-8.
42+ # Use os.dup() to create copies of file descriptors to prevent closing
43+ # the original sys.stdin/sys.stdout when the wrappers are closed.
4144 if not stdin :
42- stdin = anyio .wrap_file (TextIOWrapper (sys .stdin .buffer , encoding = "utf-8" ))
45+ stdin_fd = os .dup (sys .stdin .fileno ())
46+ stdin_bin = os .fdopen (stdin_fd , "rb" , closefd = True )
47+ stdin = anyio .wrap_file (TextIOWrapper (stdin_bin , encoding = "utf-8" ))
4348 if not stdout :
44- stdout = anyio .wrap_file (TextIOWrapper (sys .stdout .buffer , encoding = "utf-8" ))
49+ stdout_fd = os .dup (sys .stdout .fileno ())
50+ stdout_bin = os .fdopen (stdout_fd , "wb" , closefd = True )
51+ stdout = anyio .wrap_file (TextIOWrapper (stdout_bin , encoding = "utf-8" ))
4552
4653 read_stream : MemoryObjectReceiveStream [SessionMessage | Exception ]
4754 read_stream_writer : MemoryObjectSendStream [SessionMessage | Exception ]
0 commit comments