Sophie

Sophie

distrib > Mageia > 6 > armv5tl > by-pkgid > a600cd26dfe6bfd8c11f12bce5cb0eee > files > 705

python3-docs-3.5.3-1.1.mga6.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>24.2. cmd — Support for line-oriented command interpreters &mdash; Python 3.5.3 documentation</title>
    
    <link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '3.5.3',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/sidebar.js"></script>
    <link rel="search" type="application/opensearchdescription+xml"
          title="Search within Python 3.5.3 documentation"
          href="../_static/opensearch.xml"/>
    <link rel="author" title="About these documents" href="../about.html" />
    <link rel="copyright" title="Copyright" href="../copyright.html" />
    <link rel="top" title="Python 3.5.3 documentation" href="../contents.html" />
    <link rel="up" title="24. Program Frameworks" href="frameworks.html" />
    <link rel="next" title="24.3. shlex — Simple lexical analysis" href="shlex.html" />
    <link rel="prev" title="24.1. turtle — Turtle graphics" href="turtle.html" />
    <link rel="shortcut icon" type="image/png" href="../_static/py.png" />
    
    <script type="text/javascript" src="../_static/copybutton.js"></script>
    <script type="text/javascript" src="../_static/version_switch.js"></script>
    
    
 

  </head>
  <body role="document">  
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="shlex.html" title="24.3. shlex — Simple lexical analysis"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="turtle.html" title="24.1. turtle — Turtle graphics"
             accesskey="P">previous</a> |</li>
        <li><img src="../_static/py.png" alt=""
                 style="vertical-align: middle; margin-top: -1px"/></li>
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
        <li>
          <span class="version_switcher_placeholder">3.5.3</span>
          <a href="../index.html">Documentation </a> &raquo;
        </li>

          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &raquo;</li>
          <li class="nav-item nav-item-2"><a href="frameworks.html" accesskey="U">24. Program Frameworks</a> &raquo;</li>
    <li class="right">
        

    <div class="inline-search" style="display: none" role="search">
        <form class="inline-search" action="../search.html" method="get">
          <input placeholder="Quick search" type="text" name="q" />
          <input type="submit" value="Go" />
          <input type="hidden" name="check_keywords" value="yes" />
          <input type="hidden" name="area" value="default" />
        </form>
    </div>
    <script type="text/javascript">$('.inline-search').show(0);</script>
         |
    </li>

      </ul>
    </div>    

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <div class="section" id="module-cmd">
<span id="cmd-support-for-line-oriented-command-interpreters"></span><h1>24.2. <a class="reference internal" href="#module-cmd" title="cmd: Build line-oriented command interpreters."><code class="xref py py-mod docutils literal"><span class="pre">cmd</span></code></a> &#8212; Support for line-oriented command interpreters<a class="headerlink" href="#module-cmd" title="Permalink to this headline">¶</a></h1>
<p><strong>Source code:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/cmd.py">Lib/cmd.py</a></p>
<hr class="docutils" />
<p>The <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> class provides a simple framework for writing line-oriented
command interpreters.  These are often useful for test harnesses, administrative
tools, and prototypes that will later be wrapped in a more sophisticated
interface.</p>
<dl class="class">
<dt id="cmd.Cmd">
<em class="property">class </em><code class="descclassname">cmd.</code><code class="descname">Cmd</code><span class="sig-paren">(</span><em>completekey='tab'</em>, <em>stdin=None</em>, <em>stdout=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd" title="Permalink to this definition">¶</a></dt>
<dd><p>A <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> instance or subclass instance is a line-oriented interpreter
framework.  There is no good reason to instantiate <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> itself; rather,
it&#8217;s useful as a superclass of an interpreter class you define yourself in order
to inherit <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a>&#8216;s methods and encapsulate action methods.</p>
<p>The optional argument <em>completekey</em> is the <a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">readline</span></code></a> name of a completion
key; it defaults to <code class="kbd docutils literal"><span class="pre">Tab</span></code>. If <em>completekey</em> is not <a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a> and
<a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">readline</span></code></a> is available, command completion is done automatically.</p>
<p>The optional arguments <em>stdin</em> and <em>stdout</em> specify the  input and output file
objects that the Cmd instance or subclass  instance will use for input and
output. If not specified, they will default to <a class="reference internal" href="sys.html#sys.stdin" title="sys.stdin"><code class="xref py py-data docutils literal"><span class="pre">sys.stdin</span></code></a> and
<a class="reference internal" href="sys.html#sys.stdout" title="sys.stdout"><code class="xref py py-data docutils literal"><span class="pre">sys.stdout</span></code></a>.</p>
<p>If you want a given <em>stdin</em> to be used, make sure to set the instance&#8217;s
<a class="reference internal" href="#cmd.Cmd.use_rawinput" title="cmd.Cmd.use_rawinput"><code class="xref py py-attr docutils literal"><span class="pre">use_rawinput</span></code></a> attribute to <code class="docutils literal"><span class="pre">False</span></code>, otherwise <em>stdin</em> will be
ignored.</p>
</dd></dl>

<div class="section" id="cmd-objects">
<span id="id1"></span><h2>24.2.1. Cmd Objects<a class="headerlink" href="#cmd-objects" title="Permalink to this headline">¶</a></h2>
<p>A <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> instance has the following methods:</p>
<dl class="method">
<dt id="cmd.Cmd.cmdloop">
<code class="descclassname">Cmd.</code><code class="descname">cmdloop</code><span class="sig-paren">(</span><em>intro=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.cmdloop" title="Permalink to this definition">¶</a></dt>
<dd><p>Repeatedly issue a prompt, accept input, parse an initial prefix off the
received input, and dispatch to action methods, passing them the remainder of
the line as argument.</p>
<p>The optional argument is a banner or intro string to be issued before the first
prompt (this overrides the <a class="reference internal" href="#cmd.Cmd.intro" title="cmd.Cmd.intro"><code class="xref py py-attr docutils literal"><span class="pre">intro</span></code></a> class attribute).</p>
<p>If the <a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">readline</span></code></a> module is loaded, input will automatically inherit
<strong class="program">bash</strong>-like history-list editing (e.g. <code class="kbd docutils literal"><span class="pre">Control-P</span></code> scrolls back
to the last command, <code class="kbd docutils literal"><span class="pre">Control-N</span></code> forward to the next one, <code class="kbd docutils literal"><span class="pre">Control-F</span></code>
moves the cursor to the right non-destructively, <code class="kbd docutils literal"><span class="pre">Control-B</span></code> moves the
cursor to the left non-destructively, etc.).</p>
<p>An end-of-file on input is passed back as the string <code class="docutils literal"><span class="pre">'EOF'</span></code>.</p>
<p>An interpreter instance will recognize a command name <code class="docutils literal"><span class="pre">foo</span></code> if and only if it
has a method <code class="xref py py-meth docutils literal"><span class="pre">do_foo()</span></code>.  As a special case, a line beginning with the
character <code class="docutils literal"><span class="pre">'?'</span></code> is dispatched to the method <code class="xref py py-meth docutils literal"><span class="pre">do_help()</span></code>.  As another
special case, a line beginning with the character <code class="docutils literal"><span class="pre">'!'</span></code> is dispatched to the
method <code class="xref py py-meth docutils literal"><span class="pre">do_shell()</span></code> (if such a method is defined).</p>
<p>This method will return when the <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><code class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></code></a> method returns a true value.
The <em>stop</em> argument to <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><code class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></code></a> is the return value from the command&#8217;s
corresponding <code class="xref py py-meth docutils literal"><span class="pre">do_*()</span></code> method.</p>
<p>If completion is enabled, completing commands will be done automatically, and
completing of commands args is done by calling <code class="xref py py-meth docutils literal"><span class="pre">complete_foo()</span></code> with
arguments <em>text</em>, <em>line</em>, <em>begidx</em>, and <em>endidx</em>.  <em>text</em> is the string prefix
we are attempting to match: all returned matches must begin with it. <em>line</em> is
the current input line with leading whitespace removed, <em>begidx</em> and <em>endidx</em>
are the beginning and ending indexes of the prefix text, which could be used to
provide different completion depending upon which position the argument is in.</p>
<p>All subclasses of <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> inherit a predefined <code class="xref py py-meth docutils literal"><span class="pre">do_help()</span></code>.  This
method, called with an argument <code class="docutils literal"><span class="pre">'bar'</span></code>, invokes the corresponding method
<code class="xref py py-meth docutils literal"><span class="pre">help_bar()</span></code>, and if that is not present, prints the docstring of
<code class="xref py py-meth docutils literal"><span class="pre">do_bar()</span></code>, if available.  With no argument, <code class="xref py py-meth docutils literal"><span class="pre">do_help()</span></code> lists all
available help topics (that is, all commands with corresponding
<code class="xref py py-meth docutils literal"><span class="pre">help_*()</span></code> methods or commands that have docstrings), and also lists any
undocumented commands.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.onecmd">
<code class="descclassname">Cmd.</code><code class="descname">onecmd</code><span class="sig-paren">(</span><em>str</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.onecmd" title="Permalink to this definition">¶</a></dt>
<dd><p>Interpret the argument as though it had been typed in response to the prompt.
This may be overridden, but should not normally need to be; see the
<a class="reference internal" href="#cmd.Cmd.precmd" title="cmd.Cmd.precmd"><code class="xref py py-meth docutils literal"><span class="pre">precmd()</span></code></a> and <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><code class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></code></a> methods for useful execution hooks.  The
return value is a flag indicating whether interpretation of commands by the
interpreter should stop.  If there is a <code class="xref py py-meth docutils literal"><span class="pre">do_*()</span></code> method for the command
<em>str</em>, the return value of that method is returned, otherwise the return value
from the <a class="reference internal" href="#cmd.Cmd.default" title="cmd.Cmd.default"><code class="xref py py-meth docutils literal"><span class="pre">default()</span></code></a> method is returned.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.emptyline">
<code class="descclassname">Cmd.</code><code class="descname">emptyline</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.emptyline" title="Permalink to this definition">¶</a></dt>
<dd><p>Method called when an empty line is entered in response to the prompt. If this
method is not overridden, it repeats the last nonempty command entered.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.default">
<code class="descclassname">Cmd.</code><code class="descname">default</code><span class="sig-paren">(</span><em>line</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.default" title="Permalink to this definition">¶</a></dt>
<dd><p>Method called on an input line when the command prefix is not recognized. If
this method is not overridden, it prints an error message and returns.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.completedefault">
<code class="descclassname">Cmd.</code><code class="descname">completedefault</code><span class="sig-paren">(</span><em>text</em>, <em>line</em>, <em>begidx</em>, <em>endidx</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.completedefault" title="Permalink to this definition">¶</a></dt>
<dd><p>Method called to complete an input line when no command-specific
<code class="xref py py-meth docutils literal"><span class="pre">complete_*()</span></code> method is available.  By default, it returns an empty list.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.precmd">
<code class="descclassname">Cmd.</code><code class="descname">precmd</code><span class="sig-paren">(</span><em>line</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.precmd" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed just before the command line <em>line</em> is interpreted, but
after the input prompt is generated and issued.  This method is a stub in
<a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a>; it exists to be overridden by subclasses.  The return value is
used as the command which will be executed by the <a class="reference internal" href="#cmd.Cmd.onecmd" title="cmd.Cmd.onecmd"><code class="xref py py-meth docutils literal"><span class="pre">onecmd()</span></code></a> method; the
<a class="reference internal" href="#cmd.Cmd.precmd" title="cmd.Cmd.precmd"><code class="xref py py-meth docutils literal"><span class="pre">precmd()</span></code></a> implementation may re-write the command or simply return <em>line</em>
unchanged.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.postcmd">
<code class="descclassname">Cmd.</code><code class="descname">postcmd</code><span class="sig-paren">(</span><em>stop</em>, <em>line</em><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.postcmd" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed just after a command dispatch is finished.  This method is
a stub in <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a>; it exists to be overridden by subclasses.  <em>line</em> is the
command line which was executed, and <em>stop</em> is a flag which indicates whether
execution will be terminated after the call to <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><code class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></code></a>; this will be the
return value of the <a class="reference internal" href="#cmd.Cmd.onecmd" title="cmd.Cmd.onecmd"><code class="xref py py-meth docutils literal"><span class="pre">onecmd()</span></code></a> method.  The return value of this method will
be used as the new value for the internal flag which corresponds to <em>stop</em>;
returning false will cause interpretation to continue.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.preloop">
<code class="descclassname">Cmd.</code><code class="descname">preloop</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.preloop" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed once when <a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><code class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></code></a> is called.  This method is a stub
in <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a>; it exists to be overridden by subclasses.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.postloop">
<code class="descclassname">Cmd.</code><code class="descname">postloop</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cmd.Cmd.postloop" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed once when <a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><code class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></code></a> is about to return. This method
is a stub in <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a>; it exists to be overridden by subclasses.</p>
</dd></dl>

<p>Instances of <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> subclasses have some public instance variables:</p>
<dl class="attribute">
<dt id="cmd.Cmd.prompt">
<code class="descclassname">Cmd.</code><code class="descname">prompt</code><a class="headerlink" href="#cmd.Cmd.prompt" title="Permalink to this definition">¶</a></dt>
<dd><p>The prompt issued to solicit input.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.identchars">
<code class="descclassname">Cmd.</code><code class="descname">identchars</code><a class="headerlink" href="#cmd.Cmd.identchars" title="Permalink to this definition">¶</a></dt>
<dd><p>The string of characters accepted for the command prefix.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.lastcmd">
<code class="descclassname">Cmd.</code><code class="descname">lastcmd</code><a class="headerlink" href="#cmd.Cmd.lastcmd" title="Permalink to this definition">¶</a></dt>
<dd><p>The last nonempty command prefix seen.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.cmdqueue">
<code class="descclassname">Cmd.</code><code class="descname">cmdqueue</code><a class="headerlink" href="#cmd.Cmd.cmdqueue" title="Permalink to this definition">¶</a></dt>
<dd><p>A list of queued input lines.  The cmdqueue list is checked in
<a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><code class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></code></a> when new input is needed; if it is nonempty, its elements
will be processed in order, as if entered at the prompt.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.intro">
<code class="descclassname">Cmd.</code><code class="descname">intro</code><a class="headerlink" href="#cmd.Cmd.intro" title="Permalink to this definition">¶</a></dt>
<dd><p>A string to issue as an intro or banner.  May be overridden by giving the
<a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><code class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></code></a> method an argument.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.doc_header">
<code class="descclassname">Cmd.</code><code class="descname">doc_header</code><a class="headerlink" href="#cmd.Cmd.doc_header" title="Permalink to this definition">¶</a></dt>
<dd><p>The header to issue if the help output has a section for documented commands.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.misc_header">
<code class="descclassname">Cmd.</code><code class="descname">misc_header</code><a class="headerlink" href="#cmd.Cmd.misc_header" title="Permalink to this definition">¶</a></dt>
<dd><p>The header to issue if the help output has a section for miscellaneous  help
topics (that is, there are <code class="xref py py-meth docutils literal"><span class="pre">help_*()</span></code> methods without corresponding
<code class="xref py py-meth docutils literal"><span class="pre">do_*()</span></code> methods).</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.undoc_header">
<code class="descclassname">Cmd.</code><code class="descname">undoc_header</code><a class="headerlink" href="#cmd.Cmd.undoc_header" title="Permalink to this definition">¶</a></dt>
<dd><p>The header to issue if the help output has a section for undocumented  commands
(that is, there are <code class="xref py py-meth docutils literal"><span class="pre">do_*()</span></code> methods without corresponding <code class="xref py py-meth docutils literal"><span class="pre">help_*()</span></code>
methods).</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.ruler">
<code class="descclassname">Cmd.</code><code class="descname">ruler</code><a class="headerlink" href="#cmd.Cmd.ruler" title="Permalink to this definition">¶</a></dt>
<dd><p>The character used to draw separator lines under the help-message headers.  If
empty, no ruler line is drawn.  It defaults to <code class="docutils literal"><span class="pre">'='</span></code>.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.use_rawinput">
<code class="descclassname">Cmd.</code><code class="descname">use_rawinput</code><a class="headerlink" href="#cmd.Cmd.use_rawinput" title="Permalink to this definition">¶</a></dt>
<dd><p>A flag, defaulting to true.  If true, <a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><code class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></code></a> uses <a class="reference internal" href="functions.html#input" title="input"><code class="xref py py-func docutils literal"><span class="pre">input()</span></code></a> to
display a prompt and read the next command; if false, <code class="xref py py-meth docutils literal"><span class="pre">sys.stdout.write()</span></code>
and <code class="xref py py-meth docutils literal"><span class="pre">sys.stdin.readline()</span></code> are used. (This means that by importing
<a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">readline</span></code></a>, on systems that support it, the interpreter will automatically
support <strong class="program">Emacs</strong>-like line editing  and command-history keystrokes.)</p>
</dd></dl>

</div>
<div class="section" id="cmd-example">
<span id="id2"></span><h2>24.2.2. Cmd Example<a class="headerlink" href="#cmd-example" title="Permalink to this headline">¶</a></h2>
<p>The <a class="reference internal" href="#module-cmd" title="cmd: Build line-oriented command interpreters."><code class="xref py py-mod docutils literal"><span class="pre">cmd</span></code></a> module is mainly useful for building custom shells that let a
user work with a program interactively.</p>
<p>This section presents a simple example of how to build a shell around a few of
the commands in the <a class="reference internal" href="turtle.html#module-turtle" title="turtle: An educational framework for simple graphics applications"><code class="xref py py-mod docutils literal"><span class="pre">turtle</span></code></a> module.</p>
<p>Basic turtle commands such as <a class="reference internal" href="turtle.html#turtle.forward" title="turtle.forward"><code class="xref py py-meth docutils literal"><span class="pre">forward()</span></code></a> are added to a
<a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><code class="xref py py-class docutils literal"><span class="pre">Cmd</span></code></a> subclass with method named <code class="xref py py-meth docutils literal"><span class="pre">do_forward()</span></code>.  The argument is
converted to a number and dispatched to the turtle module.  The docstring is
used in the help utility provided by the shell.</p>
<p>The example also includes a basic record and playback facility implemented with
the <a class="reference internal" href="#cmd.Cmd.precmd" title="cmd.Cmd.precmd"><code class="xref py py-meth docutils literal"><span class="pre">precmd()</span></code></a> method which is responsible for converting the input to
lowercase and writing the commands to a file.  The <code class="xref py py-meth docutils literal"><span class="pre">do_playback()</span></code> method
reads the file and adds the recorded commands to the <code class="xref py py-attr docutils literal"><span class="pre">cmdqueue</span></code> for
immediate playback:</p>
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cmd</span><span class="o">,</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">turtle</span> <span class="k">import</span> <span class="o">*</span>

<span class="k">class</span> <span class="nc">TurtleShell</span><span class="p">(</span><span class="n">cmd</span><span class="o">.</span><span class="n">Cmd</span><span class="p">):</span>
    <span class="n">intro</span> <span class="o">=</span> <span class="s1">&#39;Welcome to the turtle shell.   Type help or ? to list commands.</span><span class="se">\n</span><span class="s1">&#39;</span>
    <span class="n">prompt</span> <span class="o">=</span> <span class="s1">&#39;(turtle) &#39;</span>
    <span class="n">file</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="c1"># ----- basic turtle commands -----</span>
    <span class="k">def</span> <span class="nf">do_forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Move the turtle forward by the specified distance:  FORWARD 10&#39;</span>
        <span class="n">forward</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_right</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Turn turtle right by given number of degrees:  RIGHT 20&#39;</span>
        <span class="n">right</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_left</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Turn turtle left by given number of degrees:  LEFT 90&#39;</span>
        <span class="n">left</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_goto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Move turtle to an absolute position with changing orientation.  GOTO 100 200&#39;</span>
        <span class="n">goto</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_home</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Return turtle to the home position:  HOME&#39;</span>
        <span class="n">home</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">do_circle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Draw circle with given radius an options extent and steps:  CIRCLE 50&#39;</span>
        <span class="n">circle</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_position</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Print the current turle position:  POSITION&#39;</span>
        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Current position is </span><span class="si">%d</span><span class="s1"> </span><span class="si">%d</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">position</span><span class="p">())</span>
    <span class="k">def</span> <span class="nf">do_heading</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Print the current turle heading in degrees:  HEADING&#39;</span>
        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Current heading is </span><span class="si">%d</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">heading</span><span class="p">(),))</span>
    <span class="k">def</span> <span class="nf">do_color</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Set the color:  COLOR BLUE&#39;</span>
        <span class="n">color</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
    <span class="k">def</span> <span class="nf">do_undo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Undo (repeatedly) the last turtle action(s):  UNDO&#39;</span>
    <span class="k">def</span> <span class="nf">do_reset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Clear the screen and return turtle to center:  RESET&#39;</span>
        <span class="n">reset</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">do_bye</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Stop recording, close the turtle window, and exit:  BYE&#39;</span>
        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Thank you for using Turtle&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
        <span class="n">bye</span><span class="p">()</span>
        <span class="k">return</span> <span class="kc">True</span>

    <span class="c1"># ----- record and playback -----</span>
    <span class="k">def</span> <span class="nf">do_record</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Save future commands to filename:  RECORD rose.cmd&#39;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">do_playback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s1">&#39;Playback commands from a file:  PLAYBACK rose.cmd&#39;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">cmdqueue</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span>
    <span class="k">def</span> <span class="nf">precmd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">line</span><span class="p">):</span>
        <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="ow">and</span> <span class="s1">&#39;playback&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
            <span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">line</span>
    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="kc">None</span>

<span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
    <span class="s1">&#39;Convert a series of zero or more numbers to an argument tuple&#39;</span>
    <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">()))</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">TurtleShell</span><span class="p">()</span><span class="o">.</span><span class="n">cmdloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Here is a sample session with the turtle shell showing the help functions, using
blank lines to repeat commands, and the simple record and playback facility:</p>
<div class="highlight-none"><div class="highlight"><pre><span></span>Welcome to the turtle shell.   Type help or ? to list commands.

(turtle) ?

Documented commands (type help &lt;topic&gt;):
========================================
bye     color    goto     home  playback  record  right
circle  forward  heading  left  position  reset   undo

(turtle) help forward
Move the turtle forward by the specified distance:  FORWARD 10
(turtle) record spiral.cmd
(turtle) position
Current position is 0 0

(turtle) heading
Current heading is 0

(turtle) reset
(turtle) circle 20
(turtle) right 30
(turtle) circle 40
(turtle) right 30
(turtle) circle 60
(turtle) right 30
(turtle) circle 80
(turtle) right 30
(turtle) circle 100
(turtle) right 30
(turtle) circle 120
(turtle) right 30
(turtle) circle 120
(turtle) heading
Current heading is 180

(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 500
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 300
(turtle) playback spiral.cmd
Current position is 0 0

Current heading is 0

Current heading is 180

(turtle) bye
Thank you for using Turtle
</pre></div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../contents.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">24.2. <code class="docutils literal"><span class="pre">cmd</span></code> &#8212; Support for line-oriented command interpreters</a><ul>
<li><a class="reference internal" href="#cmd-objects">24.2.1. Cmd Objects</a></li>
<li><a class="reference internal" href="#cmd-example">24.2.2. Cmd Example</a></li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="turtle.html"
                        title="previous chapter">24.1. <code class="docutils literal"><span class="pre">turtle</span></code> &#8212; Turtle graphics</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="shlex.html"
                        title="next chapter">24.3. <code class="docutils literal"><span class="pre">shlex</span></code> &#8212; Simple lexical analysis</a></p>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="../bugs.html">Report a Bug</a></li>
      <li><a href="../_sources/library/cmd.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
  </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>  
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="shlex.html" title="24.3. shlex — Simple lexical analysis"
             >next</a> |</li>
        <li class="right" >
          <a href="turtle.html" title="24.1. turtle — Turtle graphics"
             >previous</a> |</li>
        <li><img src="../_static/py.png" alt=""
                 style="vertical-align: middle; margin-top: -1px"/></li>
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
        <li>
          <span class="version_switcher_placeholder">3.5.3</span>
          <a href="../index.html">Documentation </a> &raquo;
        </li>

          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &raquo;</li>
          <li class="nav-item nav-item-2"><a href="frameworks.html" >24. Program Frameworks</a> &raquo;</li>
    <li class="right">
        

    <div class="inline-search" style="display: none" role="search">
        <form class="inline-search" action="../search.html" method="get">
          <input placeholder="Quick search" type="text" name="q" />
          <input type="submit" value="Go" />
          <input type="hidden" name="check_keywords" value="yes" />
          <input type="hidden" name="area" value="default" />
        </form>
    </div>
    <script type="text/javascript">$('.inline-search').show(0);</script>
         |
    </li>

      </ul>
    </div>  
    <div class="footer">
    &copy; <a href="../copyright.html">Copyright</a> 2001-2017, Python Software Foundation.
    <br />
    The Python Software Foundation is a non-profit corporation.
    <a href="https://www.python.org/psf/donations/">Please donate.</a>
    <br />
    Last updated on Jan 20, 2017.
    <a href="../bugs.html">Found a bug</a>?
    <br />
    Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.3.3.
    </div>

  </body>
</html>