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

30 lines
9.8 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-pty"><h1><span class="yiyi-st" id="yiyi-10">35.8. <a class="reference internal" href="#module-pty" title="pty: Pseudo-Terminal Handling for Linux. (Linux)"><code class="xref py py-mod docutils literal"><span class="pre">pty</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/pty.py">Lib / pty.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-pty" title="pty: Pseudo-Terminal Handling for Linux. (Linux)"><code class="xref py py-mod docutils literal"><span class="pre">pty</span></code></a>模块定义了处理伪终端概念的操作:启动另一个进程,并能够以编程方式对其控制终端进行写入和读取。</span></p><p><span class="yiyi-st" id="yiyi-13">因为伪终端处理高度依赖于平台所以有代码只为Linux做它。</span><span class="yiyi-st" id="yiyi-14">Linux代码应该在其他平台上工作但还没有经过测试。</span></p><p><span class="yiyi-st" id="yiyi-15"><a class="reference internal" href="#module-pty" title="pty: Pseudo-Terminal Handling for Linux. (Linux)"><code class="xref py py-mod docutils literal"><span class="pre">pty</span></code></a>模块定义以下函数:</span></p><dl class="function"><dt id="pty.fork"><span class="yiyi-st" id="yiyi-16"> <code class="descclassname">pty.</code><code class="descname">fork</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-17">叉子。</span><span class="yiyi-st" id="yiyi-18">将孩子的控制终端连接到伪终端。</span><span class="yiyi-st" id="yiyi-19">返回值是<code class="docutils literal"><span class="pre">pid</span> <span class="pre">fd</span></code></span><span class="yiyi-st" id="yiyi-20">注意,孩子得到<em>pid</em> 0<em>fd</em><em>无效</em></span><span class="yiyi-st" id="yiyi-21">父的返回值是孩子的<em>pid</em><em>fd</em>是连接到孩子的控制终端(以及孩子的标准输入和输出)的文件描述器。</span></p></dd></dl><dl class="function"><dt id="pty.openpty"><span class="yiyi-st" id="yiyi-22"> <code class="descclassname">pty.</code><code class="descname">openpty</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-23">打开一个新的伪终端对,使用<a class="reference internal" href="os.html#os.openpty" title="os.openpty"><code class="xref py py-func docutils literal"><span class="pre">os.openpty()</span></code></a>如果可能或通用Unix系统的仿真代码。</span><span class="yiyi-st" id="yiyi-24">分别为主机和从机端返回一对文件描述器<code class="docutils literal"><span class="pre">(主机,</span> <span class="pre">从机)</span> </code></span></p></dd></dl><dl class="function"><dt id="pty.spawn"><span class="yiyi-st" id="yiyi-25"> <code class="descclassname">pty.</code><code class="descname">spawn</code><span class="sig-paren">(</span><em>argv</em><span class="optional">[</span>, <em>master_read</em><span class="optional">[</span>, <em>stdin_read</em><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-26">产生一个进程并将其控制终端与当前进程的标准io连接。</span><span class="yiyi-st" id="yiyi-27">这通常用于阻挡坚持从控制终端读取的程序。</span></p><p><span class="yiyi-st" id="yiyi-28">函数<em>master_read</em><em>stdin_read</em>应为从文件描述器读取的函数。</span><span class="yiyi-st" id="yiyi-29">默认值尝试在每次调用时读取1024字节。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-30"><span class="versionmodified">在版本3.4中更改:</span> <a class="reference internal" href="#pty.spawn" title="pty.spawn"><code class="xref py py-func docutils literal"><span class="pre">spawn()</span></code></a>现在从<a class="reference internal" href="os.html#os.waitpid" title="os.waitpid"><code class="xref py py-func docutils literal"><span class="pre">os.waitpid()</span></code></a>返回子进程的状态值。</span></p></div></dd></dl><div class="section" id="example"><h2><span class="yiyi-st" id="yiyi-31">35.8.1. </span><span class="yiyi-st" id="yiyi-32">Example</span></h2><p><span class="yiyi-st" id="yiyi-33">以下程序的作用类似于Unix命令<em class="manpage">脚本1</em>使用伪终端在“typescript”中记录终端会话的所有输入和输出。</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">pty</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">time</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">'-a'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'append'</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">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'-p'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'use_python'</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">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'filename'</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">'?'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">'typescript'</span><span class="p">)</span>
<span class="n">options</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="n">shell</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">executable</span> <span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">use_python</span> <span class="k">else</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'SHELL'</span><span class="p">,</span> <span class="s1">'sh'</span><span class="p">)</span>
<span class="n">filename</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">filename</span>
<span class="n">mode</span> <span class="o">=</span> <span class="s1">'ab'</span> <span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">append</span> <span class="k">else</span> <span class="s1">'wb'</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span> <span class="k">as</span> <span class="n">script</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">1024</span><span class="p">)</span>
<span class="n">script</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">return</span> <span class="n">data</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Script started, file is'</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
<span class="n">script</span><span class="o">.</span><span class="n">write</span><span class="p">((</span><span class="s1">'Script started on </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">time</span><span class="o">.</span><span class="n">asctime</span><span class="p">())</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
<span class="n">pty</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">shell</span><span class="p">,</span> <span class="n">read</span><span class="p">)</span>
<span class="n">script</span><span class="o">.</span><span class="n">write</span><span class="p">((</span><span class="s1">'Script done on </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">time</span><span class="o">.</span><span class="n">asctime</span><span class="p">())</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Script done, file is'</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
</code></pre></div></div></div>