mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-09 15:34:05 +08:00
54 lines
32 KiB
HTML
54 lines
32 KiB
HTML
<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">"<console>"</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> |