@@ -43,11 +43,32 @@ The :mod:`pty` module defines the following functions:
4343
4444 Spawn a process, and connect its controlling terminal with the current
4545 process's standard io. This is often used to baffle programs which insist on
46- reading from the controlling terminal.
46+ reading from the controlling terminal. It is expected that the process
47+ spawned behind the pty will eventually terminate, and when it does *spawn *
48+ will return.
49+
50+ The functions *master_read * and *stdin_read * are passed a file descriptor
51+ which they should read from, and they should always return a byte string. In
52+ order to force spawn to return before the child process exits an
53+ :exc: `OSError ` should be thrown.
54+
55+ The default implementation for both functions will read and return up to 1024
56+ bytes each time the function is called. The *master_read * callback is passed
57+ the pseudoterminal’s master file descriptor to read output from the child
58+ process, and *stdin_read * is passed file descriptor 0, to read from the
59+ parent process's standard input.
60+
61+ Returning an empty byte string from either callback is interpreted as an
62+ end-of-file (EOF) condition, and that callback will not be called after
63+ that. If *stdin_read * signals EOF the controlling terminal can no longer
64+ communicate with the parent process OR the child process. Unless the child
65+ process will quit without any input, *spawn * will then loop forever. If
66+ *master_read * signals EOF the same behavior results (on linux at least).
67+
68+ If both callbacks signal EOF then *spawn * will probably never return, unless
69+ *select * throws an error on your platform when passed three empty lists. This
70+ is a bug, documented in `issue 26228 <https://bugs.python.org/issue26228 >`_.
4771
48- The functions *master_read * and *stdin_read * should be functions which read from
49- a file descriptor. The defaults try to read 1024 bytes each time they are
50- called.
5172
5273 .. versionchanged :: 3.4
5374 :func: `spawn ` now returns the status value from :func: `os.waitpid `
0 commit comments