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

54 lines
32 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-readline"><h1><span class="yiyi-st" id="yiyi-10">6.7. <a class="reference internal" href="#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> —— GNU readline接口</span></h1><p><span class="yiyi-st" id="yiyi-11"><a class="reference internal" href="#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>模块定义了许多函数以便于从Python解释器完成和读取/写入历史文件。</span><span class="yiyi-st" id="yiyi-12">此模块可以直接使用,也可以通过<a class="reference internal" href="rlcompleter.html#module-rlcompleter" title="rlcompleter: Python identifier completion, suitable for the GNU readline library."><code class="xref py py-mod docutils literal"><span class="pre">rlcompleter</span></code></a>模块使用该模块支持在交互式提示符处完成Python标识符。</span><span class="yiyi-st" id="yiyi-13">使用此模块进行的设置会影响解释器的交互式提示和由内置<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>函数提供的提示的行为。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-14">注意</span></p><p><span class="yiyi-st" id="yiyi-15">底层的Readline库API可以通过<code class="docutils literal"><span class="pre">libedit</span></code>库而不是GNU readline来实现。</span><span class="yiyi-st" id="yiyi-16">在MacOS X上<a class="reference internal" href="#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>模块检测在运行时使用哪个库。</span></p><p class="last"><span class="yiyi-st" id="yiyi-17"><code class="docutils literal"><span class="pre">libedit</span></code>的配置文件与GNU readline的配置文件不同。</span><span class="yiyi-st" id="yiyi-18">如果以编程方式加载配置字符串,您可以检查<code class="xref py py-const docutils literal"><span class="pre">readline.__doc__</span></code>中的文本“libedit”以区分GNU readline和libedit。</span></p></div><p><span class="yiyi-st" id="yiyi-19">Readline键绑定可以通过初始化文件配置通常为主目录中的<code class="docutils literal"><span class="pre">.inputrc</span></code></span><span class="yiyi-st" id="yiyi-20">有关该文件的格式和允许的结构以及一般的Readline库的功能的信息请参阅GNU Readline手册中的<a class="reference external" href="https://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC9">Readline Init File</a></span></p><div class="section" id="init-file"><h2><span class="yiyi-st" id="yiyi-21">6.7.1.</span><span class="yiyi-st" id="yiyi-22">Init文件</span></h2><p><span class="yiyi-st" id="yiyi-23">以下函数与init文件和用户配置相关</span></p><dl class="function"><dt id="readline.parse_and_bind"><span class="yiyi-st" id="yiyi-24"><code class="descclassname">readline.</code><code class="descname">parse_and_bind</code><span class="sig-paren">(</span><em>string</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-25">执行<em>string</em>参数中提供的init行。</span><span class="yiyi-st" id="yiyi-26">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">rl_parse_and_bind()</span></code></span></p></dd></dl><dl class="function"><dt id="readline.read_init_file"><span class="yiyi-st" id="yiyi-27"> <code class="descclassname">readline.</code><code class="descname">read_init_file</code><span class="sig-paren">(</span><span class="optional">[</span><em>filename</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-28">执行readline初始化文件。</span><span class="yiyi-st" id="yiyi-29">默认文件名是所使用的最后一个文件名。</span><span class="yiyi-st" id="yiyi-30">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">rl_read_init_file()</span></code></span></p></dd></dl></div><div class="section" id="line-buffer"><h2><span class="yiyi-st" id="yiyi-31">6.7.2.</span><span class="yiyi-st" id="yiyi-32">行缓冲</span></h2><p><span class="yiyi-st" id="yiyi-33">以下功能对行缓冲区进行操作:</span></p><dl class="function"><dt id="readline.get_line_buffer"><span class="yiyi-st" id="yiyi-34"><code class="descclassname">readline.</code><code class="descname">get_line_buffer</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-35">返回行缓冲区的当前内容(<code class="xref c c-data docutils literal"><span class="pre">rl_line_buffer</span></code>在底层库中)。</span></p></dd></dl><dl class="function"><dt id="readline.insert_text"><span class="yiyi-st" id="yiyi-36"><code class="descclassname">readline.</code><code class="descname">insert_text</code><span class="sig-paren">(</span><em>string</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">在光标位置的行缓冲区中插入文本。</span><span class="yiyi-st" id="yiyi-38">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">rl_insert_text()</span></code>,但忽略返回值。</span></p></dd></dl><dl class="function"><dt id="readline.redisplay"><span class="yiyi-st" id="yiyi-39"><code class="descclassname">readline.</code><code class="descname">redisplay</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-40">更改屏幕上显示的内容以反映行缓冲区的当前内容。</span><span class="yiyi-st" id="yiyi-41">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">rl_redisplay()</span></code></span></p></dd></dl></div><div class="section" id="history-file"><h2><span class="yiyi-st" id="yiyi-42">6.7.3.</span><span class="yiyi-st" id="yiyi-43">历史记录文件</span></h2><p><span class="yiyi-st" id="yiyi-44">以下功能操作历史文件:</span></p><dl class="function"><dt id="readline.read_history_file"><span class="yiyi-st" id="yiyi-45"> <code class="descclassname">readline.</code><code class="descname">read_history_file</code><span class="sig-paren">(</span><span class="optional">[</span><em>filename</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-46">加载阅读历史记录文件,并将其附加到历史记录列表。</span><span class="yiyi-st" id="yiyi-47">默认文件名为<code class="file docutils literal"><span class="pre">~/.history</span></code></span><span class="yiyi-st" id="yiyi-48">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">read_history()</span></code></span></p></dd></dl><dl class="function"><dt id="readline.write_history_file"><span class="yiyi-st" id="yiyi-49"> <code class="descclassname">readline.</code><code class="descname">write_history_file</code><span class="sig-paren">(</span><span class="optional">[</span><em>filename</em><span class="optional">]</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">默认文件名为<code class="file docutils literal"><span class="pre">~/.history</span></code></span><span class="yiyi-st" id="yiyi-52">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">write_history()</span></code></span></p></dd></dl><dl class="function"><dt id="readline.append_history_file"><span class="yiyi-st" id="yiyi-53"><code class="descclassname">readline.</code><code class="descname">append_history_file</code><span class="sig-paren">(</span><em>nelements</em><span class="optional">[</span>, <em>filename</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-54">将最后的<em>nelements</em>项目追加到文件中。</span><span class="yiyi-st" id="yiyi-55">默认文件名为<code class="file docutils literal"><span class="pre">~/.history</span></code></span><span class="yiyi-st" id="yiyi-56">文件必须已存在。</span><span class="yiyi-st" id="yiyi-57">这会在底层库中调用<code class="xref c c-func docutils literal"><span class="pre">append_history()</span></code></span><span class="yiyi-st" id="yiyi-58">此函数仅在Python是为支持它的库的版本编译时才存在。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-59"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div></dd></dl><dl class="function"><dt id="readline.get_history_length"><span class="yiyi-st" id="yiyi-60"><code class="descclassname">readline.</code><code class="descname">get_history_length</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dt id="readline.set_history_length"><span class="yiyi-st" id="yiyi-61"><code class="descclassname">readline.</code><code class="descname">set_history_length</code><span class="sig-paren">(</span><em>length</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-62">设置或返回要保存在历史记录文件中的所需行数。</span><span class="yiyi-st" id="yiyi-63">通过调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">history_truncate_file()</span></code><a class="reference internal" href="#readline.write_history_file" title="readline.write_history_file"><code class="xref py py-func docutils literal"><span class="pre">write_history_file()</span></code></a>函数使用此值截断历史记录文件。</span><span class="yiyi-st" id="yiyi-64">负值意味着无限的历史文件大小。</span></p></dd></dl></div><div class="section" id="history-list"><h2><span class="yiyi-st" id="yiyi-65">6.7.4.</span><span class="yiyi-st" id="yiyi-66">历史列表</span></h2><p><span class="yiyi-st" id="yiyi-67">以下功能对全局历史列表进行操作:</span></p><dl class="function"><dt id="readline.clear_history"><span class="yiyi-st" id="yiyi-68"><code class="descclassname">readline.</code><code class="descname">clear_history</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-69">清除当前历史记录。</span><span class="yiyi-st" id="yiyi-70">这在底层库中调用<code class="xref c c-func docutils literal"><span class="pre">clear_history()</span></code></span><span class="yiyi-st" id="yiyi-71">如果Python是为支持它的库的版本编译的Python函数才存在。</span></p></dd></dl><dl class="function"><dt id="readline.get_current_history_length"><span class="yiyi-st" id="yiyi-72"><code class="descclassname">readline.</code><code class="descname">get_current_history_length</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-73">返回当前在历史记录中的项目数。</span><span class="yiyi-st" id="yiyi-74">(这不同于<a class="reference internal" href="#readline.get_history_length" title="readline.get_history_length"><code class="xref py py-func docutils literal"><span class="pre">get_history_length()</span></code></a>,它返回将写入历史文件的最大行数。)</span></p></dd></dl><dl class="function"><dt id="readline.get_history_item"><span class="yiyi-st" id="yiyi-75"><code class="descclassname">readline.</code><code class="descname">get_history_item</code><span class="sig-paren">(</span><em>index</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-76">返回<em>索引</em>的历史记录项目的当前内容。</span><span class="yiyi-st" id="yiyi-77">项目索引是从1开始的。</span><span class="yiyi-st" id="yiyi-78">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">history_get()</span></code></span></p></dd></dl><dl class="function"><dt id="readline.remove_history_item"><span class="yiyi-st" id="yiyi-79"><code class="descclassname">readline.</code><code class="descname">remove_history_item</code><span class="sig-paren">(</span><em>pos</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-80">从历史记录中删除其位置指定的历史记录项。</span><span class="yiyi-st" id="yiyi-81">位置是零为基础。</span><span class="yiyi-st" id="yiyi-82">这会在底层库中调用<code class="xref c c-func docutils literal"><span class="pre">remove_history()</span></code></span></p></dd></dl><dl class="function"><dt id="readline.replace_history_item"><span class="yiyi-st" id="yiyi-83"><code class="descclassname">readline.</code><code class="descname">replace_history_item</code><span class="sig-paren">(</span><em>pos</em>, <em>line</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-84"><em></em>替换其位置指定的历史记录项。</span><span class="yiyi-st" id="yiyi-85">位置是零为基础。</span><span class="yiyi-st" id="yiyi-86">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">replace_history_entry()</span></code></span></p></dd></dl><dl class="function"><dt id="readline.add_history"><span class="yiyi-st" id="yiyi-87"><code class="descclassname">readline.</code><code class="descname">add_history</code><span class="sig-paren">(</span><em>line</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88"><em></em>附加到历史记录缓冲区,就好像它是最后一行键入的。</span><span class="yiyi-st" id="yiyi-89">这会调用底层库中的<code class="xref c c-func docutils literal"><span class="pre">add_history()</span></code></span></p></dd></dl></div><div class="section" id="startup-hooks"><h2><span class="yiyi-st" id="yiyi-90">6.7.5.</span><span class="yiyi-st" id="yiyi-91">启动挂接</span></h2><dl class="function"><dt id="readline.set_startup_hook"><span class="yiyi-st" id="yiyi-92"> <code class="descclassname">readline.</code><code class="descname">set_startup_hook</code><span class="sig-paren">(</span><span class="optional">[</span><em>function</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-93">设置或删除由底层库的<code class="xref c c-data docutils literal"><span class="pre">rl_startup_hook</span></code>回调调用的函数。</span><span class="yiyi-st" id="yiyi-94">如果指定<em>function</em>,它将被用作新的钩子函数;如果省略或<code class="docutils literal"><span class="pre">None</span></code>,则已安装的任何功能都将被删除。</span><span class="yiyi-st" id="yiyi-95">在readline打印第一个提示之前不使用参数来调用钩子。</span></p></dd></dl><dl class="function"><dt id="readline.set_pre_input_hook"><span class="yiyi-st" id="yiyi-96"> <code class="descclassname">readline.</code><code class="descname">set_pre_input_hook</code><span class="sig-paren">(</span><span class="optional">[</span><em>function</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-97">设置或删除由底层库的<code class="xref c c-data docutils literal"><span class="pre">rl_pre_input_hook</span></code>回调调用的函数。</span><span class="yiyi-st" id="yiyi-98">如果指定<em>function</em>,它将被用作新的钩子函数;如果省略或<code class="docutils literal"><span class="pre">None</span></code>,则已安装的任何功能都将被删除。</span><span class="yiyi-st" id="yiyi-99">在第一个提示被打印后并且readline开始读取输入字符之前没有参数的钩子被调用。</span><span class="yiyi-st" id="yiyi-100">此函数仅在Python是为支持它的库的版本编译时才存在。</span></p></dd></dl></div><div class="section" id="completion"><h2><span class="yiyi-st" id="yiyi-101">6.7.6.</span><span class="yiyi-st" id="yiyi-102">完成</span></h2><p><span class="yiyi-st" id="yiyi-103">以下功能涉及实现自定义词语完成功能。</span><span class="yiyi-st" id="yiyi-104">这通常由Tab键操作并且可以建议并自动完成键入的单词。</span><span class="yiyi-st" id="yiyi-105">默认情况下Readline设置为由<a class="reference internal" href="rlcompleter.html#module-rlcompleter" title="rlcompleter: Python identifier completion, suitable for the GNU readline library."><code class="xref py py-mod docutils literal"><span class="pre">rlcompleter</span></code></a>使用以完成交互式解释器的Python标识符。</span><span class="yiyi-st" id="yiyi-106">如果<a class="reference internal" href="#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>模块要与自定义完成程序一起使用,则应设置一组不同的字分隔符。</span></p><dl class="function"><dt id="readline.set_completer"><span class="yiyi-st" id="yiyi-107"> <code class="descclassname">readline.</code><code class="descname">set_completer</code><span class="sig-paren">(</span><span class="optional">[</span><em>function</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-108">设置或删除完成器功能。</span><span class="yiyi-st" id="yiyi-109">如果指定<em>函数</em>,它将用作新的完成函数;如果省略或<code class="docutils literal"><span class="pre">None</span></code>,则已删除已安装的任何完成器函数。</span><span class="yiyi-st" id="yiyi-110">The completer function is called as <code class="docutils literal"><span class="pre">function(text,</span> <span class="pre">state)</span></code>, for <em>state</em> in <code class="docutils literal"><span class="pre">0</span></code>, <code class="docutils literal"><span class="pre">1</span></code>, <code class="docutils literal"><span class="pre">2</span></code>, ..., until it returns a non-string value. </span><span class="yiyi-st" id="yiyi-111">它应该返回从<em>文本</em>开始的下一个可能的完成。</span></p><p><span class="yiyi-st" id="yiyi-112">安装的completionter函数由传递给底层库中的<code class="xref c c-func docutils literal"><span class="pre">rl_completion_matches()</span></code><em>entry_func</em>回调调用。</span><span class="yiyi-st" id="yiyi-113"><em>文本</em>字符串来自基础库的<code class="xref c c-data docutils literal"><span class="pre">rl_attempted_completion_function</span></code>回调的第一个参数。</span></p></dd></dl><dl class="function"><dt id="readline.get_completer"><span class="yiyi-st" id="yiyi-114"><code class="descclassname">readline.</code><code class="descname">get_completer</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-115">获取完成器函数,或<code class="docutils literal"><span class="pre">None</span></code>如果未设置完成器函数。</span></p></dd></dl><dl class="function"><dt id="readline.get_completion_type"><span class="yiyi-st" id="yiyi-116"><code class="descclassname">readline.</code><code class="descname">get_completion_type</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-117">获取尝试的完成类型。</span><span class="yiyi-st" id="yiyi-118">这会将底层库中的<code class="xref c c-data docutils literal"><span class="pre">rl_completion_type</span></code>变量​​作为整数返回。</span></p></dd></dl><dl class="function"><dt id="readline.get_begidx"><span class="yiyi-st" id="yiyi-119"><code class="descclassname">readline.</code><code class="descname">get_begidx</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dt id="readline.get_endidx"><span class="yiyi-st" id="yiyi-120"><code class="descclassname">readline.</code><code class="descname">get_endidx</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-121">获取完成范围的开始或结束索引。</span><span class="yiyi-st" id="yiyi-122">这些索引是传递给底层库的<code class="xref c c-data docutils literal"><span class="pre">rl_attempted_completion_function</span></code>回调的<em>start</em><em>end</em>参数。</span></p></dd></dl><dl class="function"><dt id="readline.set_completer_delims"><span class="yiyi-st" id="yiyi-123"><code class="descclassname">readline.</code><code class="descname">set_completer_delims</code><span class="sig-paren">(</span><em>string</em><span class="sig-paren">)</span></span></dt><dt id="readline.get_completer_delims"><span class="yiyi-st" id="yiyi-124"><code class="descclassname">readline.</code><code class="descname">get_completer_delims</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-125">设置或获取完成的单词分隔符。</span><span class="yiyi-st" id="yiyi-126">这些决定了要考虑完成的字的开始(完成范围)。</span><span class="yiyi-st" id="yiyi-127">这些函数访问底层库中的<code class="xref c c-data docutils literal"><span class="pre">rl_completer_word_break_characters</span></code>变量​​。</span></p></dd></dl><dl class="function"><dt id="readline.set_completion_display_matches_hook"><span class="yiyi-st" id="yiyi-128"> <code class="descclassname">readline.</code><code class="descname">set_completion_display_matches_hook</code><span class="sig-paren">(</span><span class="optional">[</span><em>function</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-129">设置或删除完成显示功能。</span><span class="yiyi-st" id="yiyi-130">如果指定<em>函数</em>,它将用作新的完成显示函数;如果省略或<code class="docutils literal"><span class="pre">None</span></code>,已安装的任何完成显示功能已删除。</span><span class="yiyi-st" id="yiyi-131">这会设置或清除底层库中的<code class="xref c c-data docutils literal"><span class="pre">rl_completion_display_matches_hook</span></code>回调。</span><span class="yiyi-st" id="yiyi-132">每次匹配需要时,完成显示功能称为<code class="docutils literal"><span class="pre">功能(替换,</span> <span class="pre">[matches]</span> <span class="pre">longest_match_length显示。</span></code></span></p></dd></dl></div><div class="section" id="example"><h2><span class="yiyi-st" id="yiyi-133">6.7.7.</span><span class="yiyi-st" id="yiyi-134">示例</span></h2><p><span class="yiyi-st" id="yiyi-135">以下示例演示如何使用<a class="reference internal" href="#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>模块的历史读取和写入功能,从用户的主目录自动加载并保存名为<code class="file docutils literal"><span class="pre">.python_history</span></code>的历史记录文件。</span><span class="yiyi-st" id="yiyi-136">以下代码通常在用户的<span class="target" id="index-0"></span> <a class="reference internal" href="../using/cmdline.html#envvar-PYTHONSTARTUP"><code class="xref std std-envvar docutils literal"><span class="pre">PYTHONSTARTUP</span></code></a>文件的交互会话期间自动执行。</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">atexit</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">readline</span>
<span class="n">histfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s2">"~"</span><span class="p">),</span> <span class="s2">".python_history"</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">readline</span><span class="o">.</span><span class="n">read_history_file</span><span class="p">(</span><span class="n">histfile</span><span class="p">)</span>
<span class="c1"># default history len is -1 (infinite), which may grow unruly</span>
<span class="n">readline</span><span class="o">.</span><span class="n">set_history_length</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">readline</span><span class="o">.</span><span class="n">write_history_file</span><span class="p">,</span> <span class="n">histfile</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-137">当Python在<a class="reference internal" href="../tutorial/interpreter.html#tut-interactive"><span>interactive mode</span></a>中运行时,该代码实际上自动运行(参见<a class="reference internal" href="site.html#rlcompleter-config"><span>Readline configuration</span></a>)。</span></p><p><span class="yiyi-st" id="yiyi-138">以下示例实现了相同的目标,但是通过仅附加新历史记录来支持并发交互式会话。</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">atexit</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">readline</span>
<span class="n">histfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s2">"~"</span><span class="p">),</span> <span class="s2">".python_history"</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">readline</span><span class="o">.</span><span class="n">read_history_file</span><span class="p">(</span><span class="n">histfile</span><span class="p">)</span>
<span class="n">h_len</span> <span class="o">=</span> <span class="n">readline</span><span class="o">.</span><span class="n">get_history_length</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="nb">open</span><span class="p">(</span><span class="n">histfile</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">)</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">h_len</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="n">prev_h_len</span><span class="p">,</span> <span class="n">histfile</span><span class="p">):</span>
<span class="n">new_h_len</span> <span class="o">=</span> <span class="n">readline</span><span class="o">.</span><span class="n">get_history_length</span><span class="p">()</span>
<span class="n">readline</span><span class="o">.</span><span class="n">set_history_length</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="n">readline</span><span class="o">.</span><span class="n">append_history_file</span><span class="p">(</span><span class="n">new_h_len</span> <span class="o">-</span> <span class="n">prev_h_len</span><span class="p">,</span> <span class="n">histfile</span><span class="p">)</span>
<span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">save</span><span class="p">,</span> <span class="n">h_len</span><span class="p">,</span> <span class="n">histfile</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-139">以下示例扩展了<a class="reference internal" href="code.html#code.InteractiveConsole" title="code.InteractiveConsole"><code class="xref py py-class docutils literal"><span class="pre">code.InteractiveConsole</span></code></a>类以支持历史记录保存/恢复。</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">atexit</span>
<span class="kn">import</span> <span class="nn">code</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">readline</span>
<span class="k">class</span> <span class="nc">HistoryConsole</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">InteractiveConsole</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">locals</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="s2">"&lt;console&gt;"</span><span class="p">,</span>
<span class="n">histfile</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s2">"~/.console-history"</span><span class="p">)):</span>
<span class="n">code</span><span class="o">.</span><span class="n">InteractiveConsole</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">locals</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_history</span><span class="p">(</span><span class="n">histfile</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">init_history</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">histfile</span><span class="p">):</span>
<span class="n">readline</span><span class="o">.</span><span class="n">parse_and_bind</span><span class="p">(</span><span class="s2">"tab: complete"</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">readline</span><span class="p">,</span> <span class="s2">"read_history_file"</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">readline</span><span class="o">.</span><span class="n">read_history_file</span><span class="p">(</span><span class="n">histfile</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">save_history</span><span class="p">,</span> <span class="n">histfile</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">save_history</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">histfile</span><span class="p">):</span>
<span class="n">readline</span><span class="o">.</span><span class="n">set_history_length</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="n">readline</span><span class="o">.</span><span class="n">write_history_file</span><span class="p">(</span><span class="n">histfile</span><span class="p">)</span>
</code></pre></div></div></div>