2019-04-21 11:50:48 +08:00

17 lines
30 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-shlex"><h1><span class="yiyi-st" id="yiyi-10">24.3. <a class="reference internal" href="#module-shlex" title="shlex: Simple lexical analysis for Unix shell-like languages."><code class="xref py py-mod docutils literal"><span class="pre">shlex</span></code></a> - 简单词法分析</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/shlex.py">Lib / shlex.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>类可以轻松地为类似于Unix shell的简单语法编写词法分析器。</span><span class="yiyi-st" id="yiyi-13">这通常用于编写minilanguages例如在Python应用程序的运行控制文件中或用于解析引用的字符串。</span></p><p><span class="yiyi-st" id="yiyi-14"><a class="reference internal" href="#module-shlex" title="shlex: Simple lexical analysis for Unix shell-like languages."><code class="xref py py-mod docutils literal"><span class="pre">shlex</span></code></a>模块定义以下函数:</span></p><dl class="function"><dt id="shlex.split"><span class="yiyi-st" id="yiyi-15"> <code class="descclassname">shlex.</code><code class="descname">split</code><span class="sig-paren">(</span><em>s</em>, <em>comments=False</em>, <em>posix=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-16">使用类shell语法拆分字符串<em>s</em></span><span class="yiyi-st" id="yiyi-17">If <em>comments</em> is <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal"><span class="pre">False</span></code></a> (the default), the parsing of comments in the given string will be disabled (setting the <a class="reference internal" href="#shlex.shlex.commenters" title="shlex.shlex.commenters"><code class="xref py py-attr docutils literal"><span class="pre">commenters</span></code></a> attribute of the <a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a> instance to the empty string). </span><span class="yiyi-st" id="yiyi-18">默认情况下此函数在POSIX模式下运行但如果<em>posix</em>参数为假则使用非POSIX模式。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-19">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-20">由于<a class="reference internal" href="#shlex.split" title="shlex.split"><code class="xref py py-func docutils literal"><span class="pre">split()</span></code></a>函数实例化一个<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>实例,传递<code class="docutils literal"><span class="pre">None</span></code>用于<em>s</em>标准输入。</span></p></div></dd></dl><dl class="function"><dt id="shlex.quote"><span class="yiyi-st" id="yiyi-21"> <code class="descclassname">shlex.</code><code class="descname">quote</code><span class="sig-paren">(</span><em>s</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-22">返回字符串<em>s</em>的shell转义版本。返回的值是一个字符串可以安全地用作shell命令行中的一个令牌对于不能使用列表的情况。</span></p><p><span class="yiyi-st" id="yiyi-23">这个成语是不安全的:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">filename</span> <span class="o">=</span> <span class="s1">'somefile; rm -rf ~'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">command</span> <span class="o">=</span> <span class="s1">'ls -l </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">command</span><span class="p">)</span> <span class="c1"># executed by a shell: boom!</span>
<span class="go">ls -l somefile; rm -rf ~</span>
</code></pre><p><span class="yiyi-st" id="yiyi-24"><a class="reference internal" href="#shlex.quote" title="shlex.quote"><code class="xref py py-func docutils literal"><span class="pre">quote()</span></code></a>可让您插入安全漏洞:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">command</span> <span class="o">=</span> <span class="s1">'ls -l </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">quote</span><span class="p">(</span><span class="n">filename</span><span class="p">))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
<span class="go">ls -l 'somefile; rm -rf ~'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">remote_command</span> <span class="o">=</span> <span class="s1">'ssh home </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">quote</span><span class="p">(</span><span class="n">command</span><span class="p">))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">remote_command</span><span class="p">)</span>
<span class="go">ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"''</span>
</code></pre><p><span class="yiyi-st" id="yiyi-25">引用与UNIX shell兼容并且<a class="reference internal" href="#shlex.split" title="shlex.split"><code class="xref py py-func docutils literal"><span class="pre">split()</span></code></a></span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">remote_command</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">remote_command</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">remote_command</span>
<span class="go">['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">command</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">remote_command</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">command</span>
<span class="go">['ls', '-l', 'somefile; rm -rf ~']</span>
</code></pre><div class="versionadded"><p><span class="yiyi-st" id="yiyi-26"><span class="versionmodified">版本3.3中的新功能。</span></span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-27"><a class="reference internal" href="#module-shlex" title="shlex: Simple lexical analysis for Unix shell-like languages."><code class="xref py py-mod docutils literal"><span class="pre">shlex</span></code></a>模块定义了以下类:</span></p><dl class="class"><dt id="shlex.shlex"><span class="yiyi-st" id="yiyi-28"> <em class="property">class </em><code class="descclassname">shlex.</code><code class="descname">shlex</code><span class="sig-paren">(</span><em>instream=None</em>, <em>infile=None</em>, <em>posix=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-29">A <a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>实例或子类实例是词法分析器对象。</span><span class="yiyi-st" id="yiyi-30">初始化参数(如果存在)指定从哪里读取字符。</span><span class="yiyi-st" id="yiyi-31">它必须是具有<a class="reference internal" href="io.html#io.TextIOBase.read" title="io.TextIOBase.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a><a class="reference internal" href="io.html#io.TextIOBase.readline" title="io.TextIOBase.readline"><code class="xref py py-meth docutils literal"><span class="pre">readline()</span></code></a>方法的文件/流类对象或字符串。</span><span class="yiyi-st" id="yiyi-32">如果没有给出参数,则将从<code class="docutils literal"><span class="pre">sys.stdin</span></code>获取输入。</span><span class="yiyi-st" id="yiyi-33">第二个可选参数是文件名字符串,用于设置<a class="reference internal" href="#shlex.shlex.infile" title="shlex.shlex.infile"><code class="xref py py-attr docutils literal"><span class="pre">infile</span></code></a>属性的初始值。</span><span class="yiyi-st" id="yiyi-34">如果省略<em>instream</em>参数或等于<code class="docutils literal"><span class="pre">sys.stdin</span></code>则此第二个参数默认为“stdin”。</span><span class="yiyi-st" id="yiyi-35"><em>posix</em>参数定义操作模式:当<em>posix</em>不为true默认<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>实例将以兼容模式运行。</span><span class="yiyi-st" id="yiyi-36">当在POSIX模式下操作时<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>将尝试尽可能接近POSIX外壳解析规则。</span></p></dd></dl><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-37">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-38">模块<a class="reference internal" href="configparser.html#module-configparser" title="configparser: Configuration file parser."><code class="xref py py-mod docutils literal"><span class="pre">configparser</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-39">解析器用于类似于Windows <code class="file docutils literal"><span class="pre">.ini</span></code>文件的配置文件。</span></dd></dl></div><div class="section" id="shlex-objects"><h2><span class="yiyi-st" id="yiyi-40">24.3.1. shlex对象</span></h2><p><span class="yiyi-st" id="yiyi-41"><a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>实例具有以下方法:</span></p><dl class="method"><dt id="shlex.shlex.get_token"><span class="yiyi-st" id="yiyi-42"> <code class="descclassname">shlex.</code><code class="descname">get_token</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-43">返回标记。</span><span class="yiyi-st" id="yiyi-44">如果使用<a class="reference internal" href="#shlex.shlex.push_token" title="shlex.shlex.push_token"><code class="xref py py-meth docutils literal"><span class="pre">push_token()</span></code></a>堆叠令牌,请从堆栈中弹出令牌。</span><span class="yiyi-st" id="yiyi-45">否则,从输入流中读取一个。</span><span class="yiyi-st" id="yiyi-46">如果读取遇到立即文件结束,则返回<a class="reference internal" href="#shlex.shlex.eof" title="shlex.shlex.eof"><code class="xref py py-attr docutils literal"><span class="pre">eof</span></code></a>非POSIX模式下的空字符串<code class="docutils literal"><span class="pre">''</span></code>)和<code class="docutils literal"><span class="pre">None</span></code></span></p></dd></dl><dl class="method"><dt id="shlex.shlex.push_token"><span class="yiyi-st" id="yiyi-47"> <code class="descclassname">shlex.</code><code class="descname">push_token</code><span class="sig-paren">(</span><em>str</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-48">将参数推送到令牌堆栈。</span></p></dd></dl><dl class="method"><dt id="shlex.shlex.read_token"><span class="yiyi-st" id="yiyi-49"> <code class="descclassname">shlex.</code><code class="descname">read_token</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-50">阅读原始令牌。</span><span class="yiyi-st" id="yiyi-51">忽略后推堆栈,并且不解释源请求。</span><span class="yiyi-st" id="yiyi-52">(这通常不是一个有用的切入点,并且在这里仅仅是为了完整性的记录。)</span></p></dd></dl><dl class="method"><dt id="shlex.shlex.sourcehook"><span class="yiyi-st" id="yiyi-53"> <code class="descclassname">shlex.</code><code class="descname">sourcehook</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-54"><a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>检测到源请求时(参见下面的<a class="reference internal" href="#shlex.shlex.source" title="shlex.shlex.source"><code class="xref py py-attr docutils literal"><span class="pre">source</span></code></a>),此方法将给出以下令牌作为参数,并且希望返回由文件名和打开的文件组成的元组,像对象。</span></p><p><span class="yiyi-st" id="yiyi-55">通常,此方法首先剥离参数的任何引号。</span><span class="yiyi-st" id="yiyi-56">如果结果是绝对路径名,或者没有生效的上一个源请求,或者上一个源是流(例如<code class="docutils literal"><span class="pre">sys.stdin</span></code>),则结果将保留。</span><span class="yiyi-st" id="yiyi-57">否则如果结果是相对路径名则在源包含堆栈上紧邻其前的文件的名称的目录部分被前置该行为类似于C预处理器处理<code class="docutils literal"><span class="pre">#include &gt; t1&gt; <span class="pre">“file.h”</span></span></code>)。</span></p><p><span class="yiyi-st" id="yiyi-58">操作的结果被视为文件名,并作为元组的第一个组件返回,<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>调用它产生第二个组件。</span><span class="yiyi-st" id="yiyi-59">(注意:这是与实例初始化中的参数顺序相反的!)</span></p><p><span class="yiyi-st" id="yiyi-60">这个钩子是暴露的,所以你可以使用它来实现目录搜索路径,添加文件扩展名和其他命名空间黑客。</span><span class="yiyi-st" id="yiyi-61">没有相应的“关闭”钩子但是当它返回EOF时shlex实例将调用源输入流的<a class="reference internal" href="io.html#io.IOBase.close" title="io.IOBase.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>方法。</span></p><p><span class="yiyi-st" id="yiyi-62">要更明确地控制源堆叠,请使用<a class="reference internal" href="#shlex.shlex.push_source" title="shlex.shlex.push_source"><code class="xref py py-meth docutils literal"><span class="pre">push_source()</span></code></a><a class="reference internal" href="#shlex.shlex.pop_source" title="shlex.shlex.pop_source"><code class="xref py py-meth docutils literal"><span class="pre">pop_source()</span></code></a>方法。</span></p></dd></dl><dl class="method"><dt id="shlex.shlex.push_source"><span class="yiyi-st" id="yiyi-63"> <code class="descclassname">shlex.</code><code class="descname">push_source</code><span class="sig-paren">(</span><em>newstream</em>, <em>newfile=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-64">将输入源流推送到输入堆栈。</span><span class="yiyi-st" id="yiyi-65">如果指定了filename参数它以后将可用于错误消息。</span><span class="yiyi-st" id="yiyi-66">这是由<a class="reference internal" href="#shlex.shlex.sourcehook" title="shlex.shlex.sourcehook"><code class="xref py py-meth docutils literal"><span class="pre">sourcehook()</span></code></a>方法内部使用的相同方法。</span></p></dd></dl><dl class="method"><dt id="shlex.shlex.pop_source"><span class="yiyi-st" id="yiyi-67"> <code class="descclassname">shlex.</code><code class="descname">pop_source</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-68">从输入堆栈弹出最后推入的输入源。</span><span class="yiyi-st" id="yiyi-69">这是当词法分析器在堆叠输入流上到达EOF时内部使用的相同方法。</span></p></dd></dl><dl class="method"><dt id="shlex.shlex.error_leader"><span class="yiyi-st" id="yiyi-70"> <code class="descclassname">shlex.</code><code class="descname">error_leader</code><span class="sig-paren">(</span><em>infile=None</em>, <em>lineno=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-71">此方法以Unix C编译器错误标签的格式生成错误消息引导程序格式为<code class="docutils literal"><span class="pre">'“s”</span> <span class="pre"></span> <span class="pre">d</span> <span class="pre">'</span> 其中<code class="docutils literal"><span class="pre">%s</span></code>替换为当前源文件的名称,<code class="docutils literal"><span class="pre">%d</span></code>替换为当前输入行号(可选参数可用于覆盖这些)。</code></span></p><p><span class="yiyi-st" id="yiyi-72">提供此便利是为了鼓励<a class="reference internal" href="#module-shlex" title="shlex: Simple lexical analysis for Unix shell-like languages."><code class="xref py py-mod docutils literal"><span class="pre">shlex</span></code></a>用户以Emacs和其他Unix工具理解的标准可解析格式生成错误消息。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-73"><a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>子类的实例具有一些公共实例变量,它们控制词法分析或可用于调试:</span></p><dl class="attribute"><dt id="shlex.shlex.commenters"><span class="yiyi-st" id="yiyi-74"> <code class="descclassname">shlex.</code><code class="descname">commenters</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-75">被识别为注释初学者的字符串。</span><span class="yiyi-st" id="yiyi-76">将忽略评论初学者到行尾的所有字符。</span><span class="yiyi-st" id="yiyi-77">默认情况下只包含<code class="docutils literal"><span class="pre">'#'</span></code></span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.wordchars"><span class="yiyi-st" id="yiyi-78"> <code class="descclassname">shlex.</code><code class="descname">wordchars</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-79">将会累积到多字符令牌中的字符串。</span><span class="yiyi-st" id="yiyi-80">默认情况下包括所有ASCII字母数字和下划线。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.whitespace"><span class="yiyi-st" id="yiyi-81"> <code class="descclassname">shlex.</code><code class="descname">whitespace</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-82">将被视为空格并被跳过的字符。</span><span class="yiyi-st" id="yiyi-83">空白限制令牌。</span><span class="yiyi-st" id="yiyi-84">默认情况下,包括空格,制表符,换行符和回车。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.escape"><span class="yiyi-st" id="yiyi-85"> <code class="descclassname">shlex.</code><code class="descname">escape</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-86">将被视为逃逸的字符。</span><span class="yiyi-st" id="yiyi-87">这将仅在POSIX模式下使用默认情况下只包括<code class="docutils literal"><span class="pre">'\'</span></code></span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.quotes"><span class="yiyi-st" id="yiyi-88"> <code class="descclassname">shlex.</code><code class="descname">quotes</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-89">将被视为字符串引号的字符。</span><span class="yiyi-st" id="yiyi-90">令牌累积直到再次遇到相同的引号因此不同的引号类型在shell中保护对方</span><span class="yiyi-st" id="yiyi-91">默认情况下包括ASCII单引号和双引号。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.escapedquotes"><span class="yiyi-st" id="yiyi-92"> <code class="descclassname">shlex.</code><code class="descname">escapedquotes</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-93"><a class="reference internal" href="#shlex.shlex.quotes" title="shlex.shlex.quotes"><code class="xref py py-attr docutils literal"><span class="pre">quotes</span></code></a>中的字符,用于解释<a class="reference internal" href="#shlex.shlex.escape" title="shlex.shlex.escape"><code class="xref py py-attr docutils literal"><span class="pre">escape</span></code></a>中定义的转义字符。</span><span class="yiyi-st" id="yiyi-94">这只在POSIX模式下使用默认情况下只包括<code class="docutils literal"><span class="pre">'"'</span></code></span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.whitespace_split"><span class="yiyi-st" id="yiyi-95"> <code class="descclassname">shlex.</code><code class="descname">whitespace_split</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-96">如果<code class="docutils literal"><span class="pre">True</span></code>,则标记将仅分割为空格。</span><span class="yiyi-st" id="yiyi-97">这很有用,例如,用<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>解析命令行以类似于shell参数的方式获取令牌。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.infile"><span class="yiyi-st" id="yiyi-98"> <code class="descclassname">shlex.</code><code class="descname">infile</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-99">当前输入文件的名称,最初在类实例化时设置或由以后的源请求堆叠。</span><span class="yiyi-st" id="yiyi-100">在构造错误消息时检查这可能是有用的。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.instream"><span class="yiyi-st" id="yiyi-101"> <code class="descclassname">shlex.</code><code class="descname">instream</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-102"><a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>实例的输入流正在读取字符。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.source"><span class="yiyi-st" id="yiyi-103"> <code class="descclassname">shlex.</code><code class="descname">source</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-104">默认情况下,此属性为<code class="docutils literal"><span class="pre">None</span></code></span><span class="yiyi-st" id="yiyi-105">如果为其分配一个字符串该字符串将被识别为词汇级包含请求类似于各种shell中的<code class="docutils literal"><span class="pre">source</span></code>关键字。</span><span class="yiyi-st" id="yiyi-106">也就是说紧随其后的令牌将作为文件名打开并且将从该流中获取输入直到EOF此时将调用该流的<a class="reference internal" href="io.html#io.IOBase.close" title="io.IOBase.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>方法,并且输入源将再次成为原始输入流。</span><span class="yiyi-st" id="yiyi-107">源请求可以被堆叠在任何数量级的深度。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.debug"><span class="yiyi-st" id="yiyi-108"> <code class="descclassname">shlex.</code><code class="descname">debug</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-109">如果此属性为数字且<code class="docutils literal"><span class="pre">1</span></code>或更多,则<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>实例将在其行为上打印详细的进度输出。</span><span class="yiyi-st" id="yiyi-110">如果你需要使用这个,你可以阅读模块的源代码来了解细节。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.lineno"><span class="yiyi-st" id="yiyi-111"> <code class="descclassname">shlex.</code><code class="descname">lineno</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-112">源行号(到目前为止看到的换行符的计数加一)。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.token"><span class="yiyi-st" id="yiyi-113"> <code class="descclassname">shlex.</code><code class="descname">token</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-114">令牌缓冲区。</span><span class="yiyi-st" id="yiyi-115">在捕获异常时检查这可能是有用的。</span></p></dd></dl><dl class="attribute"><dt id="shlex.shlex.eof"><span class="yiyi-st" id="yiyi-116"> <code class="descclassname">shlex.</code><code class="descname">eof</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-117">令牌用于确定文件结束。</span><span class="yiyi-st" id="yiyi-118">在POSIX模式下这将设置为空字符串<code class="docutils literal"><span class="pre">''</span></code>在非POSIX模式下设置为<code class="docutils literal"><span class="pre">None</span></code></span></p></dd></dl></div><div class="section" id="parsing-rules"><h2><span class="yiyi-st" id="yiyi-119">24.3.2. </span><span class="yiyi-st" id="yiyi-120">Parsing Rules</span></h2><p><span class="yiyi-st" id="yiyi-121">当在非POSIX模式下操作时<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>将尝试遵守以下规则。</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-122">不能在字中识别引号字符(<code class="docutils literal"><span class="pre">Do"Not"Separate</span></code>被解析为单个字<code class="docutils literal"><span class="pre">Do"Not"Separate</span></code></span></li><li><span class="yiyi-st" id="yiyi-123">无法识别转义字符;</span></li><li><span class="yiyi-st" id="yiyi-124">在引号中包含字符保留引号内所有字符的字面值值;</span></li><li><span class="yiyi-st" id="yiyi-125">结束引号分隔单词(<code class="docutils literal"><span class="pre">"Do"Separate</span></code>被解析为<code class="docutils literal"><span class="pre">"Do"</span></code><code class="docutils literal"><span class="pre">Separate</span></code></span></li><li><span class="yiyi-st" id="yiyi-126">如果<a class="reference internal" href="#shlex.shlex.whitespace_split" title="shlex.shlex.whitespace_split"><code class="xref py py-attr docutils literal"><span class="pre">whitespace_split</span></code></a><code class="docutils literal"><span class="pre">False</span></code>,则未声明为字字符,空格或引号的任何字符将作为单字符令牌返回。</span><span class="yiyi-st" id="yiyi-127">如果<code class="docutils literal"><span class="pre">True</span></code><a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>将只分割空格中的单词;</span></li><li><span class="yiyi-st" id="yiyi-128">EOF用空字符串<code class="docutils literal"><span class="pre">''</span></code>)用信号通知;</span></li><li><span class="yiyi-st" id="yiyi-129">它不可能解析空字符串,即使引用。</span></li></ul><p><span class="yiyi-st" id="yiyi-130">当在POSIX模式下操作时<a class="reference internal" href="#shlex.shlex" title="shlex.shlex"><code class="xref py py-class docutils literal"><span class="pre">shlex</span></code></a>将尝试服从以下解析规则。</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-131">引号被剥离,不要分隔单词(<code class="docutils literal"><span class="pre">"Do"Not"Separate"</span></code>被解析为单个单词<code class="docutils literal"><span class="pre">DoNotSeparate</span></code></span></li><li><span class="yiyi-st" id="yiyi-132">非引号转义字符(例如,</span><span class="yiyi-st" id="yiyi-133"><code class="docutils literal"><span class="pre">'\'</span></code>)保留下一个字符的字面值值;</span></li><li><span class="yiyi-st" id="yiyi-134">将不是<a class="reference internal" href="#shlex.shlex.escapedquotes" title="shlex.shlex.escapedquotes"><code class="xref py py-attr docutils literal"><span class="pre">escapedquotes</span></code></a>(例如<code class="docutils literal"><span class="pre">"'"</span></code>)一部分的引号中的字符保留引号内所有字符的字面值值;</span></li><li><span class="yiyi-st" id="yiyi-135">Enclosing characters in quotes which are part of <a class="reference internal" href="#shlex.shlex.escapedquotes" title="shlex.shlex.escapedquotes"><code class="xref py py-attr docutils literal"><span class="pre">escapedquotes</span></code></a> (e.g. <code class="docutils literal"><span class="pre">'"'</span></code>) preserves the literal value of all characters within the quotes, with the exception of the characters mentioned in <a class="reference internal" href="#shlex.shlex.escape" title="shlex.shlex.escape"><code class="xref py py-attr docutils literal"><span class="pre">escape</span></code></a>. </span><span class="yiyi-st" id="yiyi-136">转义字符只有在使用中引用引号或转义字符本身时才保留其特殊含义。</span><span class="yiyi-st" id="yiyi-137">否则,转义字符将被视为正常字符。</span></li><li><span class="yiyi-st" id="yiyi-138">EOF用<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>值用信号通知;</span></li><li><span class="yiyi-st" id="yiyi-139">允许引用空字符串(<code class="docutils literal"><span class="pre">''</span></code>)。</span></li></ul></div></div></div>