杰瑞科技汇

python3 readline模块

什么是 readline 模块?

readline 模块是一个 Python 的标准库模块,它为用户提供了一个功能强大的命令行行编辑和历史记录功能,当你使用 Python 的交互式解释器(REPL)时,你可以使用方向键移动光标、上下键浏览历史命令、按 Ctrl+R 搜索历史命令,这些功能都是由 readline 模块提供的。

python3 readline模块-图1
(图片来源网络,侵删)

readline 让你的 Python 脚本在需要用户输入时,拥有和顶级终端(如 Bash、Zsh)一样高级的交互体验。


核心功能与常用方法

readline 模块主要围绕两个核心函数:readline()add_history()

1 readline()

这是模块中最核心的函数,用于从标准输入读取一行。

import readline
# 提示用户输入
name = input("请输入你的名字: ") # 内部也调用了 readline
# 使用 readline() 实现
# 注意:readline() 不会自动打印提示符,需要我们自己处理
prompt = "请输入你的年龄: "
age = input(prompt) # 推荐 input(),因为它更简洁且会处理提示符
# 如果非要直接用 readline()
# age = readline.readline(prompt) # 这样写提示符会出现在输入行的末尾,体验不好
# 更好的方式是先打印提示符,再调用 readline()
print(prompt, end='') # end='' 避免自动换行
age = readline.readline()
age = age.strip() # readline() 会保留换行符,需要去除

关键区别:input() vs readline.readline()

  • input(prompt): 会自动打印 prompt,并等待用户输入,它会读取一行,自动去除末尾的换行符 \n,并返回字符串,这是绝大多数情况下的首选。
  • readline.readline(prompt): 会读取一行,保留末尾的换行符 \nprompt 参数会将提示符放在输入行的末尾,而不是新行开头,这通常不是我们想要的效果。

在编写需要用户输入的脚本时,优先使用 input(),当你需要更精细地控制输入行为,或者需要利用 readline 的其他高级功能(如历史记录、自动补全)时,才直接使用 readline 模块。

2 add_history()

这个函数用于将用户输入的一行内容添加到历史记录列表中。

import readline
while True:
    user_input = input(">>> ") # 使用 input() 读取
    if user_input.lower() == 'exit':
        break
    # 将输入添加到历史记录
    readline.add_history(user_input)
    print(f"你输入了: {user_input}")
print("程序结束。")
# 现在你可以按上下键,看到之前输入的所有 'exit' 之外的命令

3 get_history_item()get_current_history_length()

你可以读取历史记录中的内容。

import readline
# 假设历史记录中已经有 "command1", "command2"
readline.add_history("command1")
readline.add_history("command2")
# 获取历史记录的总长度
length = readline.get_current_history_length()
print(f"历史记录长度: {length}") # 输出: 2
# 获取历史记录中的某一项
# 注意:索引从 1 开始
item1 = readline.get_history_item(1)
print(f"历史记录第1项: {item1}") # 输出: command1
item2 = readline.get_history_item(2)
print(f"历史记录第2项: {item2}") # 输出: command2

4 clear_history()

清空整个历史记录。

import readline
readline.add_history("to be deleted")
readline.add_history("also to be deleted")
print("清空前历史记录:")
print(readline.get_current_history_length()) # 输出 2
readline.clear_history()
print("清空后历史记录:")
print(readline.get_current_history_length()) # 输出 0

高级功能:Tab 自动补全

readline 最强大的功能之一就是 Tab 自动补全,我们可以通过设置 readlinecompleter 来实现。

实现步骤:

  1. 定义一个补全函数:这个函数接收两个参数:text(用户已经输入的文本)和 state(一个整数,用于迭代)。
  2. 设置 completer:将我们定义的函数赋值给 readline.set_completer()
  3. 设置补全行为:使用 readline.parse_and_bind() 来绑定按键。tab: complete 表示按下 Tab 键时触发补全功能。
  4. 设置分隔符readline.set_completer_delims() 定义哪些字符被视为单词分隔符,默认情况下,空格和制表符是分隔符,这意味着补全只会在单词的开头或结尾触发,如果我们想补全文件路径,通常需要将 从分隔符中移除。

示例:实现一个简单的命令补全器

import readline
import rlcompleter # Python 标准库,用于补全 Python 标识符
# --- 1. 定义补全函数 ---
# 我们想补全的命令列表
commands = ['start', 'stop', 'status', 'restart', 'configure']
def simple_completer(text, state):
    """
    补全函数
    :param text: 用户已经输入的文本
    :param state: 当前补全选项的索引
    :return: 匹配的选项,如果没有则返回 None
    """
    # 匹配所有以 text 开头的命令
    options = [cmd for cmd in commands if cmd.startswith(text)]
    # state 从 0 开始,当 options[state] 存在时返回,否则返回 None
    if state < len(options):
        return options[state]
    else:
        return None
# --- 2. 设置补全器 ---
readline.set_completer(simple_completer)
# --- 3. 绑定 Tab 键 ---
# rl_completion_query_items 是一个变量,设置为 1 意味着当有多个补全选项时,
# 会列出所有选项,而不是需要按多次 Tab 来切换。
readline.parse_and_bind("tab: complete")
# --- 4. 设置分隔符 (可选) ---
# 如果我们不设置,补全会在单词边界工作
# 输入 "st" 然后按 Tab,会补全 "start" 和 "stop"
# 但如果我们输入 "my st",它不会补全
# 移除空格作为分隔符可以让补全在任何位置发生
# readline.set_completer_delims(' \t\n;') # 可以自定义分隔符
# --- 主循环 ---
print("简单的命令补全器,输入命令或按 Tab 键补全,输入 'exit' 退出。")
while True:
    try:
        user_input = input("> ")
        if user_input == 'exit':
            break
        print(f"你输入了: {user_input}")
    except KeyboardInterrupt:
        print("\n程序已退出。")
        break
    except EOFError:
        print("\n程序已退出。")
        break

如何运行:

  1. 将上面的代码保存为 completer_example.py
  2. 在终端中运行 python3 completer_example.py
  3. 输入 st 然后按 Tab 键,会自动补全为 start
  4. 输入 s 然后按 Tab 键,会看到 startstop 两个选项。

跨平台注意事项

readline 模块的行为在不同操作系统上有所不同:

  • Linux / macOS: readline 模块是原生的,功能非常完整,直接导入即可使用。
  • Windows: Python 的标准库中没有 readline 模块,Windows 上的 readline 通常是一个第三方包,最常用的是 pyreadline3

在 Windows 上安装 pyreadline3:

pip install pyreadline3

安装后,你的 Python 脚本在 Windows 上也能使用 readline 的功能。pyreadline3 的某些高级特性(如 rlcompleter 的完美集成)可能与 Linux/macOS 上的原生 readline 有细微差别。


实际应用场景

  1. 交互式脚本: 创建一个需要用户多次输入命令的脚本,如数据库管理工具、服务器控制台等,Tab 补全和历史记录极大地提升了用户体验。
  2. REPL 增强: 如果你正在开发自己的 Python 解释器或交互式环境,readline 是实现友好界面的不二之选。
  3. 数据输入工具: 当用户需要输入大量数据时,历史记录功能可以让他们方便地回溯和修改之前的输入。
功能 方法 描述
基本输入 readline.readline(prompt) 从标准输入读取一行,保留换行符input() 更方便。
历史记录 readline.add_history(line) 将一行文本添加到历史记录。
readline.get_history_item(i) 获取历史记录中第 i 项(从1开始)。
readline.get_current_history_length() 获取历史记录的总长度。
readline.clear_history() 清空所有历史记录。
自动补全 readline.set_completer(func) 设置一个自定义的补全函数。
readline.parse_and_bind("tab: complete") 绑定 Tab 键到补全功能。
跨平台 import readline Linux/macOS 原生支持。
pip install pyreadline3 Windows 上需要安装此第三方包。

readline 是一个强大且易用的工具,能够显著提升命令行应用的交互性和专业度,对于任何需要与用户进行复杂交互的 Python 程序,都应该考虑使用它。

分享:
扫描分享到社交APP
上一篇
下一篇