blob: 12268437d07e984dfa91504fec480ae77ecf28e3 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`pty` --- Pseudo-terminal utilities
2========================================
3
4.. module:: pty
Benjamin Petersona0dfa822009-11-13 02:25:08 +00005 :platform: Linux
6 :synopsis: Pseudo-Terminal Handling for Linux.
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04007
Georg Brandl116aa622007-08-15 14:28:22 +00008.. moduleauthor:: Steen Lumholt
9.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
10
Terry Jan Reedyfa089b92016-06-11 15:02:54 -040011**Source code:** :source:`Lib/pty.py`
12
13--------------
Georg Brandl116aa622007-08-15 14:28:22 +000014
15The :mod:`pty` module defines operations for handling the pseudo-terminal
16concept: starting another process and being able to write to and read from its
17controlling terminal programmatically.
18
Mark Dickinson934896d2009-02-21 20:59:32 +000019Because pseudo-terminal handling is highly platform dependent, there is code to
Benjamin Petersona0dfa822009-11-13 02:25:08 +000020do it only for Linux. (The Linux code is supposed to work on other platforms,
21but hasn't been tested yet.)
Georg Brandl116aa622007-08-15 14:28:22 +000022
23The :mod:`pty` module defines the following functions:
24
25
26.. function:: fork()
27
28 Fork. Connect the child's controlling terminal to a pseudo-terminal. Return
29 value is ``(pid, fd)``. Note that the child gets *pid* 0, and the *fd* is
30 *invalid*. The parent's return value is the *pid* of the child, and *fd* is a
31 file descriptor connected to the child's controlling terminal (and also to the
32 child's standard input and output).
33
34
35.. function:: openpty()
36
37 Open a new pseudo-terminal pair, using :func:`os.openpty` if possible, or
Benjamin Petersona0dfa822009-11-13 02:25:08 +000038 emulation code for generic Unix systems. Return a pair of file descriptors
39 ``(master, slave)``, for the master and the slave end, respectively.
Georg Brandl116aa622007-08-15 14:28:22 +000040
41
42.. function:: spawn(argv[, master_read[, stdin_read]])
43
44 Spawn a process, and connect its controlling terminal with the current
45 process's standard io. This is often used to baffle programs which insist on
Geoff Shannon522ccef2019-05-20 08:06:16 -070046 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.
Georg Brandl116aa622007-08-15 14:28:22 +000049
Geoff Shannon522ccef2019-05-20 08:06:16 -070050 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 pseudoterminals 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>`_.
71
Georg Brandl116aa622007-08-15 14:28:22 +000072
Gregory P. Smith0f21adf72012-09-29 12:41:03 -070073 .. versionchanged:: 3.4
74 :func:`spawn` now returns the status value from :func:`os.waitpid`
75 on the child process.
Georg Brandl4cf83f42010-12-30 17:22:33 +000076
77Example
78-------
79
80.. sectionauthor:: Steen Lumholt
81
82The following program acts like the Unix command :manpage:`script(1)`, using a
83pseudo-terminal to record all input and output of a terminal session in a
84"typescript". ::
85
Berker Peksagc2dd6802015-05-12 17:25:06 +030086 import argparse
87 import os
88 import pty
89 import sys
90 import time
Georg Brandl4cf83f42010-12-30 17:22:33 +000091
Berker Peksagc2dd6802015-05-12 17:25:06 +030092 parser = argparse.ArgumentParser()
93 parser.add_argument('-a', dest='append', action='store_true')
94 parser.add_argument('-p', dest='use_python', action='store_true')
95 parser.add_argument('filename', nargs='?', default='typescript')
96 options = parser.parse_args()
Georg Brandl4cf83f42010-12-30 17:22:33 +000097
Berker Peksagc2dd6802015-05-12 17:25:06 +030098 shell = sys.executable if options.use_python else os.environ.get('SHELL', 'sh')
99 filename = options.filename
100 mode = 'ab' if options.append else 'wb'
Georg Brandl4cf83f42010-12-30 17:22:33 +0000101
Berker Peksagc2dd6802015-05-12 17:25:06 +0300102 with open(filename, mode) as script:
103 def read(fd):
104 data = os.read(fd, 1024)
105 script.write(data)
106 return data
Georg Brandl4cf83f42010-12-30 17:22:33 +0000107
Berker Peksagc2dd6802015-05-12 17:25:06 +0300108 print('Script started, file is', filename)
109 script.write(('Script started on %s\n' % time.asctime()).encode())
Georg Brandl4cf83f42010-12-30 17:22:33 +0000110
Berker Peksagc2dd6802015-05-12 17:25:06 +0300111 pty.spawn(shell, read)
Georg Brandl4cf83f42010-12-30 17:22:33 +0000112
Berker Peksagc2dd6802015-05-12 17:25:06 +0300113 script.write(('Script done on %s\n' % time.asctime()).encode())
114 print('Script done, file is', filename)