blob: 1ab2d7423fc4906c9dd293432eba5c8fc1c9fcaf [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`cmd` --- Support for line-oriented command interpreters
2=============================================================
3
4.. module:: cmd
5 :synopsis: Build line-oriented command interpreters.
6.. sectionauthor:: Eric S. Raymond <esr@snark.thyrsus.com>
7
Raymond Hettinger10480942011-01-10 03:26:08 +00008**Source code:** :source:`Lib/cmd.py`
Georg Brandl116aa622007-08-15 14:28:22 +00009
Raymond Hettinger4f707fd2011-01-10 19:54:11 +000010--------------
11
Georg Brandl116aa622007-08-15 14:28:22 +000012The :class:`Cmd` class provides a simple framework for writing line-oriented
13command interpreters. These are often useful for test harnesses, administrative
14tools, and prototypes that will later be wrapped in a more sophisticated
15interface.
16
Georg Brandl0d8f0732009-04-05 22:20:44 +000017.. class:: Cmd(completekey='tab', stdin=None, stdout=None)
Georg Brandl116aa622007-08-15 14:28:22 +000018
19 A :class:`Cmd` instance or subclass instance is a line-oriented interpreter
20 framework. There is no good reason to instantiate :class:`Cmd` itself; rather,
21 it's useful as a superclass of an interpreter class you define yourself in order
22 to inherit :class:`Cmd`'s methods and encapsulate action methods.
23
24 The optional argument *completekey* is the :mod:`readline` name of a completion
25 key; it defaults to :kbd:`Tab`. If *completekey* is not :const:`None` and
26 :mod:`readline` is available, command completion is done automatically.
27
28 The optional arguments *stdin* and *stdout* specify the input and output file
29 objects that the Cmd instance or subclass instance will use for input and
Georg Brandl0c77a822008-06-10 16:37:50 +000030 output. If not specified, they will default to :data:`sys.stdin` and
31 :data:`sys.stdout`.
32
33 If you want a given *stdin* to be used, make sure to set the instance's
34 :attr:`use_rawinput` attribute to ``False``, otherwise *stdin* will be
35 ignored.
Georg Brandl116aa622007-08-15 14:28:22 +000036
Georg Brandl116aa622007-08-15 14:28:22 +000037
38.. _cmd-objects:
39
40Cmd Objects
41-----------
42
43A :class:`Cmd` instance has the following methods:
44
45
Georg Brandl0d8f0732009-04-05 22:20:44 +000046.. method:: Cmd.cmdloop(intro=None)
Georg Brandl116aa622007-08-15 14:28:22 +000047
48 Repeatedly issue a prompt, accept input, parse an initial prefix off the
49 received input, and dispatch to action methods, passing them the remainder of
50 the line as argument.
51
52 The optional argument is a banner or intro string to be issued before the first
Senthil Kumarana6bac952011-07-04 11:28:30 -070053 prompt (this overrides the :attr:`intro` class attribute).
Georg Brandl116aa622007-08-15 14:28:22 +000054
55 If the :mod:`readline` module is loaded, input will automatically inherit
56 :program:`bash`\ -like history-list editing (e.g. :kbd:`Control-P` scrolls back
57 to the last command, :kbd:`Control-N` forward to the next one, :kbd:`Control-F`
58 moves the cursor to the right non-destructively, :kbd:`Control-B` moves the
59 cursor to the left non-destructively, etc.).
60
61 An end-of-file on input is passed back as the string ``'EOF'``.
62
63 An interpreter instance will recognize a command name ``foo`` if and only if it
64 has a method :meth:`do_foo`. As a special case, a line beginning with the
65 character ``'?'`` is dispatched to the method :meth:`do_help`. As another
66 special case, a line beginning with the character ``'!'`` is dispatched to the
67 method :meth:`do_shell` (if such a method is defined).
68
69 This method will return when the :meth:`postcmd` method returns a true value.
70 The *stop* argument to :meth:`postcmd` is the return value from the command's
71 corresponding :meth:`do_\*` method.
72
73 If completion is enabled, completing commands will be done automatically, and
74 completing of commands args is done by calling :meth:`complete_foo` with
75 arguments *text*, *line*, *begidx*, and *endidx*. *text* is the string prefix
76 we are attempting to match: all returned matches must begin with it. *line* is
77 the current input line with leading whitespace removed, *begidx* and *endidx*
78 are the beginning and ending indexes of the prefix text, which could be used to
79 provide different completion depending upon which position the argument is in.
80
Georg Brandlb2566cf2010-08-02 20:27:20 +000081 All subclasses of :class:`Cmd` inherit a predefined :meth:`do_help`. This
Georg Brandl116aa622007-08-15 14:28:22 +000082 method, called with an argument ``'bar'``, invokes the corresponding method
Georg Brandlb2566cf2010-08-02 20:27:20 +000083 :meth:`help_bar`, and if that is not present, prints the docstring of
84 :meth:`do_bar`, if available. With no argument, :meth:`do_help` lists all
85 available help topics (that is, all commands with corresponding
86 :meth:`help_\*` methods or commands that have docstrings), and also lists any
87 undocumented commands.
Georg Brandl116aa622007-08-15 14:28:22 +000088
89
90.. method:: Cmd.onecmd(str)
91
92 Interpret the argument as though it had been typed in response to the prompt.
93 This may be overridden, but should not normally need to be; see the
94 :meth:`precmd` and :meth:`postcmd` methods for useful execution hooks. The
95 return value is a flag indicating whether interpretation of commands by the
96 interpreter should stop. If there is a :meth:`do_\*` method for the command
97 *str*, the return value of that method is returned, otherwise the return value
98 from the :meth:`default` method is returned.
99
100
101.. method:: Cmd.emptyline()
102
103 Method called when an empty line is entered in response to the prompt. If this
104 method is not overridden, it repeats the last nonempty command entered.
105
106
107.. method:: Cmd.default(line)
108
109 Method called on an input line when the command prefix is not recognized. If
110 this method is not overridden, it prints an error message and returns.
111
112
113.. method:: Cmd.completedefault(text, line, begidx, endidx)
114
115 Method called to complete an input line when no command-specific
116 :meth:`complete_\*` method is available. By default, it returns an empty list.
117
118
119.. method:: Cmd.precmd(line)
120
121 Hook method executed just before the command line *line* is interpreted, but
122 after the input prompt is generated and issued. This method is a stub in
123 :class:`Cmd`; it exists to be overridden by subclasses. The return value is
124 used as the command which will be executed by the :meth:`onecmd` method; the
125 :meth:`precmd` implementation may re-write the command or simply return *line*
126 unchanged.
127
128
129.. method:: Cmd.postcmd(stop, line)
130
131 Hook method executed just after a command dispatch is finished. This method is
132 a stub in :class:`Cmd`; it exists to be overridden by subclasses. *line* is the
133 command line which was executed, and *stop* is a flag which indicates whether
134 execution will be terminated after the call to :meth:`postcmd`; this will be the
135 return value of the :meth:`onecmd` method. The return value of this method will
136 be used as the new value for the internal flag which corresponds to *stop*;
137 returning false will cause interpretation to continue.
138
139
140.. method:: Cmd.preloop()
141
142 Hook method executed once when :meth:`cmdloop` is called. This method is a stub
143 in :class:`Cmd`; it exists to be overridden by subclasses.
144
145
146.. method:: Cmd.postloop()
147
148 Hook method executed once when :meth:`cmdloop` is about to return. This method
149 is a stub in :class:`Cmd`; it exists to be overridden by subclasses.
150
Georg Brandl116aa622007-08-15 14:28:22 +0000151
Georg Brandl2677fae2014-10-31 10:25:38 +0100152Instances of :class:`Cmd` subclasses have some public instance variables:
Georg Brandl116aa622007-08-15 14:28:22 +0000153
154.. attribute:: Cmd.prompt
155
156 The prompt issued to solicit input.
157
158
159.. attribute:: Cmd.identchars
160
161 The string of characters accepted for the command prefix.
162
163
164.. attribute:: Cmd.lastcmd
165
166 The last nonempty command prefix seen.
167
168
Georg Brandl2677fae2014-10-31 10:25:38 +0100169.. attribute:: Cmd.cmdqueue
170
171 A list of queued input lines. The cmdqueue list is checked in
172 :meth:`cmdloop` when new input is needed; if it is nonempty, its elements
173 will be processed in order, as if entered at the prompt.
174
175
Georg Brandl116aa622007-08-15 14:28:22 +0000176.. attribute:: Cmd.intro
177
178 A string to issue as an intro or banner. May be overridden by giving the
179 :meth:`cmdloop` method an argument.
180
181
182.. attribute:: Cmd.doc_header
183
184 The header to issue if the help output has a section for documented commands.
185
186
187.. attribute:: Cmd.misc_header
188
189 The header to issue if the help output has a section for miscellaneous help
190 topics (that is, there are :meth:`help_\*` methods without corresponding
191 :meth:`do_\*` methods).
192
193
194.. attribute:: Cmd.undoc_header
195
196 The header to issue if the help output has a section for undocumented commands
197 (that is, there are :meth:`do_\*` methods without corresponding :meth:`help_\*`
198 methods).
199
200
201.. attribute:: Cmd.ruler
202
203 The character used to draw separator lines under the help-message headers. If
204 empty, no ruler line is drawn. It defaults to ``'='``.
205
206
207.. attribute:: Cmd.use_rawinput
208
209 A flag, defaulting to true. If true, :meth:`cmdloop` uses :func:`input` to
210 display a prompt and read the next command; if false, :meth:`sys.stdout.write`
211 and :meth:`sys.stdin.readline` are used. (This means that by importing
212 :mod:`readline`, on systems that support it, the interpreter will automatically
213 support :program:`Emacs`\ -like line editing and command-history keystrokes.)
214
Éric Araujo6e7d0ba2011-08-19 00:39:57 +0200215
216.. _cmd-example:
217
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000218Cmd Example
Alexander Belopolskyf0a0d142010-10-27 03:06:43 +0000219-----------
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000220
221.. sectionauthor:: Raymond Hettinger <python at rcn dot com>
222
223The :mod:`cmd` module is mainly useful for building custom shells that let a
224user work with a program interactively.
225
226This section presents a simple example of how to build a shell around a few of
227the commands in the :mod:`turtle` module.
228
229Basic turtle commands such as :meth:`~turtle.forward` are added to a
230:class:`Cmd` subclass with method named :meth:`do_forward`. The argument is
231converted to a number and dispatched to the turtle module. The docstring is
232used in the help utility provided by the shell.
233
234The example also includes a basic record and playback facility implemented with
235the :meth:`~Cmd.precmd` method which is responsible for converting the input to
236lowercase and writing the commands to a file. The :meth:`do_playback` method
237reads the file and adds the recorded commands to the :attr:`cmdqueue` for
238immediate playback::
239
240 import cmd, sys
241 from turtle import *
242
243 class TurtleShell(cmd.Cmd):
244 intro = 'Welcome to the turtle shell. Type help or ? to list commands.\n'
245 prompt = '(turtle) '
246 file = None
247
248 # ----- basic turtle commands -----
249 def do_forward(self, arg):
250 'Move the turtle forward by the specified distance: FORWARD 10'
251 forward(*parse(arg))
252 def do_right(self, arg):
253 'Turn turtle right by given number of degrees: RIGHT 20'
254 right(*parse(arg))
255 def do_left(self, arg):
256 'Turn turtle left by given number of degrees: LEFT 90'
Ezio Melotti4165bfb2011-09-10 10:06:01 +0300257 left(*parse(arg))
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000258 def do_goto(self, arg):
259 'Move turtle to an absolute position with changing orientation. GOTO 100 200'
260 goto(*parse(arg))
261 def do_home(self, arg):
Donald Stufft8b852f12014-05-20 12:58:38 -0400262 'Return turtle to the home position: HOME'
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000263 home()
264 def do_circle(self, arg):
265 'Draw circle with given radius an options extent and steps: CIRCLE 50'
266 circle(*parse(arg))
267 def do_position(self, arg):
268 'Print the current turle position: POSITION'
269 print('Current position is %d %d\n' % position())
270 def do_heading(self, arg):
271 'Print the current turle heading in degrees: HEADING'
272 print('Current heading is %d\n' % (heading(),))
273 def do_color(self, arg):
274 'Set the color: COLOR BLUE'
275 color(arg.lower())
276 def do_undo(self, arg):
277 'Undo (repeatedly) the last turtle action(s): UNDO'
278 def do_reset(self, arg):
279 'Clear the screen and return turtle to center: RESET'
280 reset()
281 def do_bye(self, arg):
282 'Stop recording, close the turtle window, and exit: BYE'
283 print('Thank you for using Turtle')
284 self.close()
285 bye()
Raymond Hettinger921d1242012-07-12 11:26:01 -0700286 return True
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000287
288 # ----- record and playback -----
289 def do_record(self, arg):
290 'Save future commands to filename: RECORD rose.cmd'
291 self.file = open(arg, 'w')
292 def do_playback(self, arg):
293 'Playback commands from a file: PLAYBACK rose.cmd'
294 self.close()
Éric Araujoa3dd56b2011-03-11 17:42:48 +0100295 with open(arg) as f:
296 self.cmdqueue.extend(f.read().splitlines())
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000297 def precmd(self, line):
298 line = line.lower()
299 if self.file and 'playback' not in line:
300 print(line, file=self.file)
301 return line
302 def close(self):
303 if self.file:
304 self.file.close()
305 self.file = None
306
307 def parse(arg):
308 'Convert a series of zero or more numbers to an argument tuple'
309 return tuple(map(int, arg.split()))
310
311 if __name__ == '__main__':
312 TurtleShell().cmdloop()
313
314
315Here is a sample session with the turtle shell showing the help functions, using
316blank lines to repeat commands, and the simple record and playback facility::
317
318 Welcome to the turtle shell. Type help or ? to list commands.
319
320 (turtle) ?
321
322 Documented commands (type help <topic>):
323 ========================================
324 bye color goto home playback record right
325 circle forward heading left position reset undo
326
Raymond Hettingerbd889e82010-09-09 01:40:50 +0000327 (turtle) help forward
328 Move the turtle forward by the specified distance: FORWARD 10
329 (turtle) record spiral.cmd
330 (turtle) position
331 Current position is 0 0
332
333 (turtle) heading
334 Current heading is 0
335
336 (turtle) reset
337 (turtle) circle 20
338 (turtle) right 30
339 (turtle) circle 40
340 (turtle) right 30
341 (turtle) circle 60
342 (turtle) right 30
343 (turtle) circle 80
344 (turtle) right 30
345 (turtle) circle 100
346 (turtle) right 30
347 (turtle) circle 120
348 (turtle) right 30
349 (turtle) circle 120
350 (turtle) heading
351 Current heading is 180
352
353 (turtle) forward 100
354 (turtle)
355 (turtle) right 90
356 (turtle) forward 100
357 (turtle)
358 (turtle) right 90
359 (turtle) forward 400
360 (turtle) right 90
361 (turtle) forward 500
362 (turtle) right 90
363 (turtle) forward 400
364 (turtle) right 90
365 (turtle) forward 300
366 (turtle) playback spiral.cmd
367 Current position is 0 0
368
369 Current heading is 0
370
371 Current heading is 180
372
373 (turtle) bye
374 Thank you for using Turtle
375