mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
30 lines
9.8 KiB
HTML
30 lines
9.8 KiB
HTML
<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> |