uTools-Manuals/docs/python/getopt.html
2019-04-21 11:50:48 +08:00

55 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-getopt"><h1><span class="yiyi-st" id="yiyi-10">16.5. <a class="reference internal" href="#module-getopt" title="getopt: Portable parser for command line options; support both short and long option names."><code class="xref py py-mod docutils literal"><span class="pre">getopt</span></code></a> - 命令行选项的C样式解析器</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/getopt.py">Lib / getopt.py</a></span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-12">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-13"><a class="reference internal" href="#module-getopt" title="getopt: Portable parser for command line options; support both short and long option names."><code class="xref py py-mod docutils literal"><span class="pre">getopt</span></code></a>模块是用于命令行选项的解析器其API设计为C <code class="xref c c-func docutils literal"><span class="pre">getopt()</span></code>函数的用户熟悉。</span><span class="yiyi-st" id="yiyi-14">不熟悉C <code class="xref c c-func docutils literal"><span class="pre">getopt()</span></code>功能或想要编写较少代码并获得更好帮助和错误消息的用户应考虑使用<a class="reference internal" href="argparse.html#module-argparse" title="argparse: Command-line option and argument parsing library."><code class="xref py py-mod docutils literal"><span class="pre">argparse</span></code></a>模块。</span></p></div><p><span class="yiyi-st" id="yiyi-15">此模块帮助脚本解析<code class="docutils literal"><span class="pre">sys.argv</span></code>中的命令行参数。</span><span class="yiyi-st" id="yiyi-16">它支持与Unix <code class="xref c c-func docutils literal"><span class="pre">getopt()</span></code>函数相同的约定(包括“<code class="docutils literal"><span class="pre">-</span></code>”和“<code class="docutils literal"><span class="pre">--</span></code> ')。</span><span class="yiyi-st" id="yiyi-17">类似于GNU软件支持的长选项也可以通过可选的第三个参数使用。</span></p><p><span class="yiyi-st" id="yiyi-18">此模块提供两个功能和一个例外:</span></p><dl class="function"><dt id="getopt.getopt"><span class="yiyi-st" id="yiyi-19"> <code class="descclassname">getopt.</code><code class="descname">getopt</code><span class="sig-paren">(</span><em>args</em>, <em>shortopts</em>, <em>longopts=[]</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-20">解析命令行选项和参数列表。</span><span class="yiyi-st" id="yiyi-21"><em>args</em>是要解析的参数列表,没有对正在运行的程序的引用引用。</span><span class="yiyi-st" id="yiyi-22">通常,这意味着<code class="docutils literal"><span class="pre">sys.argv[1:]</span></code></span><span class="yiyi-st" id="yiyi-23"><em>shortopts</em>是脚本想要识别的选项字母的字符串,选项需要一个参数后跟一个冒号(<code class="docutils literal"><span class="pre">':'</span></code> <code class="xref c c-func docutils literal"><span class="pre">getopt()</span></code>使用)。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-24">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-25">与GNU <code class="xref c c-func docutils literal"><span class="pre">getopt()</span></code>不同,在非选项参数后,所有其他参数也被视为非选项。</span><span class="yiyi-st" id="yiyi-26">这与非GNU Unix系统的工作方式类似。</span></p></div><p><span class="yiyi-st" id="yiyi-27"><em>longopts</em>(如果指定)必须是具有应支持的长选项的名称的字符串列表。</span><span class="yiyi-st" id="yiyi-28">前导的<code class="docutils literal"><span class="pre">'--'</span></code>字符不应包含在选项名称中。</span><span class="yiyi-st" id="yiyi-29">需要参数的长选项后面应该加上等号(<code class="docutils literal"><span class="pre">'='</span></code>)。</span><span class="yiyi-st" id="yiyi-30">不支持可选参数。</span><span class="yiyi-st" id="yiyi-31">要仅接受长选项,<em>shortopts</em>应为空字符串。</span><span class="yiyi-st" id="yiyi-32">可以识别命令行上的长选项,只要它们提供的选项名称的前缀与所接受的选项完全匹配即可。</span><span class="yiyi-st" id="yiyi-33">例如,如果<em>longopts</em><code class="docutils literal"><span class="pre">['foo'</span> <span class="pre">'frob']</span></code>,则<code class="docutils literal"><span class="pre">--fo</span></code>会匹配<code class="docutils literal"><span class="pre">--foo</span></code>,但<code class="docutils literal"><span class="pre">--f</span></code>不会唯一匹配,所以会引发<a class="reference internal" href="#getopt.GetoptError" title="getopt.GetoptError"><code class="xref py py-exc docutils literal"><span class="pre">GetoptError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-34">返回值由两个元素组成:第一个是<code class="docutils literal"><span class="pre">(选项,</span> <span class="pre">值)</span></code>对的列表;第二个是在选项列表被剥离之后留下的程序参数的列表(这是<em>args</em>的尾部切片)。</span><span class="yiyi-st" id="yiyi-35">每个返回的选项和值对具有该选项作为其第一个元素,前缀为短选项的连字符(例如,<code class="docutils literal"><span class="pre">'-x'</span></code>)或长选项的两个连字符(例如<code class="docutils literal"><span class="pre">'--long-option'</span></code>),选项参数作为其第二个元素,如果选项没有参数,则为空字符串。</span><span class="yiyi-st" id="yiyi-36">选项在列表中以与查找它们相同的顺序出现,因此允许多次出现。</span><span class="yiyi-st" id="yiyi-37">长短选项可能会混合。</span></p></dd></dl><dl class="function"><dt id="getopt.gnu_getopt"><span class="yiyi-st" id="yiyi-38"> <code class="descclassname">getopt.</code><code class="descname">gnu_getopt</code><span class="sig-paren">(</span><em>args</em>, <em>shortopts</em>, <em>longopts=[]</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">此函数的工作原理类似于<a class="reference internal" href="#module-getopt" title="getopt: Portable parser for command line options; support both short and long option names."><code class="xref py py-func docutils literal"><span class="pre">getopt()</span></code></a>除了默认情况下使用GNU样式扫描模式。</span><span class="yiyi-st" id="yiyi-40">这意味着选项和非选项参数可以混合。</span><span class="yiyi-st" id="yiyi-41">只要遇到非选项参数,<a class="reference internal" href="#module-getopt" title="getopt: Portable parser for command line options; support both short and long option names."><code class="xref py py-func docutils literal"><span class="pre">getopt()</span></code></a>函数就会停止处理选项。</span></p><p><span class="yiyi-st" id="yiyi-42">如果选项字符串的第一个字符为<code class="docutils literal"><span class="pre">'+'</span></code>,或者如果设置了环境变量<span class="target" id="index-0"></span> <code class="xref std std-envvar docutils literal"><span class="pre">POSIXLY_CORRECT</span></code>,则选项处理将立即停止遇到非选项参数。</span></p></dd></dl><dl class="exception"><dt id="getopt.GetoptError"><span class="yiyi-st" id="yiyi-43"> <em class="property">exception </em><code class="descclassname">getopt.</code><code class="descname">GetoptError</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">当在参数列表中找到一个无法识别的选项时,或者当一个需要参数的选项没有被赋予时,就会出现这种情况。</span><span class="yiyi-st" id="yiyi-45">异常的参数是指示错误原因的字符串。</span><span class="yiyi-st" id="yiyi-46">对于长选项,给予不需要的选项的参数也将引起此异常。</span><span class="yiyi-st" id="yiyi-47">属性<code class="xref py py-attr docutils literal"><span class="pre">msg</span></code><code class="xref py py-attr docutils literal"><span class="pre">opt</span></code>给出错误消息和相关选项;如果没有与异常相关的特定选项,则<code class="xref py py-attr docutils literal"><span class="pre">opt</span></code>是一个空字符串。</span></p></dd></dl><dl class="exception"><dt id="getopt.error"><span class="yiyi-st" id="yiyi-48"> <em class="property">exception </em><code class="descclassname">getopt.</code><code class="descname">error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-49"><a class="reference internal" href="#getopt.GetoptError" title="getopt.GetoptError"><code class="xref py py-exc docutils literal"><span class="pre">GetoptError</span></code></a>的别名以实现向后兼容。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-50">仅使用Unix样式选项的示例</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">getopt</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">args</span> <span class="o">=</span> <span class="s1">'-a -b -cfoo -d bar a1 a2'</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">args</span>
<span class="go">['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">optlist</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">getopt</span><span class="o">.</span><span class="n">getopt</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s1">'abc:d:'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">optlist</span>
<span class="go">[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">args</span>
<span class="go">['a1', 'a2']</span>
</code></pre><p><span class="yiyi-st" id="yiyi-51">使用长选项名称同样很容易:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="s1">'--condition=foo --testing --output-file abc.def -x a1 a2'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">args</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">args</span>
<span class="go">['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">optlist</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">getopt</span><span class="o">.</span><span class="n">getopt</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s1">'x'</span><span class="p">,</span> <span class="p">[</span>
<span class="gp">... </span> <span class="s1">'condition='</span><span class="p">,</span> <span class="s1">'output-file='</span><span class="p">,</span> <span class="s1">'testing'</span><span class="p">])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">optlist</span>
<span class="go">[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">args</span>
<span class="go">['a1', 'a2']</span>
</code></pre><p><span class="yiyi-st" id="yiyi-52">在脚本中,典型的用法是这样的:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">getopt</span><span class="o">,</span> <span class="nn">sys</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">opts</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">getopt</span><span class="o">.</span><span class="n">getopt</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="s2">"ho:v"</span><span class="p">,</span> <span class="p">[</span><span class="s2">"help"</span><span class="p">,</span> <span class="s2">"output="</span><span class="p">])</span>
<span class="k">except</span> <span class="n">getopt</span><span class="o">.</span><span class="n">GetoptError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># print help information and exit:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="c1"># will print something like "option -a not recognized"</span>
<span class="n">usage</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">output</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">verbose</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">o</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">opts</span><span class="p">:</span>
<span class="k">if</span> <span class="n">o</span> <span class="o">==</span> <span class="s2">"-v"</span><span class="p">:</span>
<span class="n">verbose</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="n">o</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-h"</span><span class="p">,</span> <span class="s2">"--help"</span><span class="p">):</span>
<span class="n">usage</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">o</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-o"</span><span class="p">,</span> <span class="s2">"--output"</span><span class="p">):</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">a</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">assert</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">"unhandled option"</span>
<span class="c1"># ...</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</code></pre><p><span class="yiyi-st" id="yiyi-53">注意,通过使用<a class="reference internal" href="argparse.html#module-argparse" title="argparse: Command-line option and argument parsing library."><code class="xref py py-mod docutils literal"><span class="pre">argparse</span></code></a>模块,可以生成更少代码和更多信息帮助和错误消息的等效命令行界面:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">argparse</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'-o'</span><span class="p">,</span> <span class="s1">'--output'</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'-v'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'verbose'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="c1"># ... do something with args.output ...</span>
<span class="c1"># ... do something with args.verbose ..</span>
</code></pre><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-54">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-55">模块<a class="reference internal" href="argparse.html#module-argparse" title="argparse: Command-line option and argument parsing library."><code class="xref py py-mod docutils literal"><span class="pre">argparse</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-56">备用命令行选项和参数解析库。</span></dd></dl></div></div></div>