杰瑞科技汇

Python readline读取如何实现?

Python 有两种主要的“读取行”的方式:

Python readline读取如何实现?-图1
(图片来源网络,侵删)
  1. input() 函数:这是最常用、最简单的方式,它从标准输入(通常是键盘)读取一行,并自动移除行尾的换行符 \n,返回一个字符串。
  2. readline 模块:这是一个更底层的模块,它提供了对 GNU readline 库的接口(在 Linux 和 macOS 上是原生支持的,在 Windows 上需要额外安装),它功能非常强大,支持命令行编辑(如方向键移动光标)、历史记录(上下箭头查看之前的输入)等功能。

对于绝大多数简单的脚本,input() 就足够了,当你需要构建一个交互式命令行工具,希望有类似 Bash 那样的体验时,readline 模块就是你的不二之选。


简单的 input() 函数

这是最基础、最常用的方法。

特点:

  • 内置函数,无需导入任何模块。
  • 读取一行输入,自动去掉结尾的换行符
  • 返回一个字符串。

示例代码:

Python readline读取如何实现?-图2
(图片来源网络,侵删)
# 提示用户输入名字
name = input("请输入您的名字: ")
# 打印欢迎信息
print(f"你好, {name}!")
# 提示用户输入年龄
age_str = input("请输入您的年龄: ")
# input() 返回的是字符串,如果需要数字需要转换
age = int(age_str)
print(f"您明年将 {age + 1} 岁。")

运行示例:

请输入您的名字: Alice
你好, Alice!
请输入您的年龄: 30
您明年将 31 岁。

功能强大的 readline 模块

readline 模块让你可以构建更复杂的交互式程序。

1 基本用法:readline()

readline.readline() 函数的行为与 input() 类似,但它不会自动移除行尾的换行符

示例代码:

Python readline读取如何实现?-图3
(图片来源网络,侵删)
import readline
# 提示用户输入
print("请输入一些内容,然后按回车键:")
# readline() 会保留行尾的 \n
user_input = readline.readline()
# 打印原始输入和去掉换行符后的输入
print(f"原始输入(包含换行符): '{user_input}'")
print(f"去掉换行符后的输入: '{user_input.strip()}'")

运行示例:

Hello World
原始输入(包含换行符): 'Hello World\n'
去掉换行符后的输入: 'Hello World'

注意:在 Windows 上,你可能需要先安装 pyreadline 库:pip install pyreadline

2 核心功能:历史记录

readline 模块最强大的功能之一就是它能自动记录用户的输入历史。

示例代码:

import readline
# 设置历史记录文件
# 之后用户的输入会被保存到这个文件中
HISTORY_FILE = '.my_app_history'
def load_history():
    try:
        readline.read_history_file(HISTORY_FILE)
    except FileNotFoundError:
        # 如果文件不存在,忽略错误
        pass
def save_history():
    readline.write_history_file(HISTORY_FILE)
if __name__ == "__main__":
    load_history()
    print("欢迎使用交互式计算器!")
    print("输入 'exit' 退出。")
    while True:
        try:
            # 使用 input() 会更简单,因为它会自动处理 readline 的历史记录功能
            # 如果用 readline.readline(),历史记录功能默认是开启的
            user_input = input(">>> ")
            if user_input.lower() == 'exit':
                break
            # 尝试执行简单的计算
            try:
                result = eval(user_input)
                print(f"结果: {result}")
            except (SyntaxError, NameError):
                print("无效的表达式。")
        except KeyboardInterrupt:
            print("\n程序被用户中断。")
            break
        except EOFError:
            print("\n检测到输入结束。")
            break
    save_history()
    print("再见!")

运行示例:

  1. 第一次运行,输入 2+2,得到 结果: 4
  2. 然后按上箭头键,会看到 2+2 重新出现在命令行。
  3. 按回车键,再次得到 结果: 4
  4. 输入 3*5,得到 结果: 15
  5. 再次按上箭头,会先看到 3*5,再按一次上箭头,会看到 2+2
  6. 输入 exit 退出程序。
  7. 下次再运行这个脚本,之前输入的 2+23*5 仍然可以通过上下箭头访问。

3 readline 模块的其他重要功能

readline 模块还提供了很多其他有用的函数,通常用于设置补全功能。

示例:设置 Tab 自动补全

这个例子展示了如何为你的命令行程序创建一个简单的 Tab 补全功能。

import readline
import rlcompleter # 内置的补全器模块
# 定义一个补全列表
COMMANDS = ["start", "stop", "restart", "status", "config", "help"]
# 设置补全函数
def completer(text, state):
    """
    补全函数
    text: 用户当前输入的文本
    state: 当前补全选项的索引 (0, 1, 2, ...)
    """
    options = [cmd for cmd in COMMANDS if cmd.startswith(text)]
    if state < len(options):
        return options[state]
    else:
        return None
# 设置 readline 的补全器
readline.set_completer(completer)
# 设置补全的触发字符,Tab 键的转义序列是 '\t'
readline.parse_and_bind("tab: complete")
# 设置为 'emacs' 或 'vi' 风格
readline.parse_and_bind("emacs-editing-mode")
print("可用命令:", ", ".join(COMMANDS))
print("输入命令后按 Tab 键尝试自动补全。")
while True:
    try:
        user_input = input("my-app> ").strip()
        if not user_input:
            continue
        if user_input in COMMANDS:
            print(f"正在执行命令: {user_input}")
        elif user_input == 'exit':
            break
        else:
            print(f"未知命令: {user_input}")
    except KeyboardInterrupt:
        print("\n程序已退出。")
        break

运行示例:

可用命令: start, stop, restart, status, config, help
输入命令后按 Tab 键尝试自动补全。
my-app> s<Tab>
my-app> st<Tab><Tab>
my-app> start
正在执行命令: start
my-app> st<Tab><Tab>
start    status
my-app> sta

input()readline.readline() 的关键区别总结

特性 input(prompt) readline.readline([prompt])
模块 内置,无需导入 需要导入 readline 模块
换行符 自动移除行尾的 \n 保留行尾的 \n
历史记录 默认启用(依赖 readline 模块) 默认启用(依赖 readline 模块)
命令行编辑 默认启用(依赖 readline 模块) 默认启用(依赖 readline 模块)
高级功能 有,如 set_completer, read_history_file
跨平台 良好 Windows 需安装 pyreadline
主要用途 简单的脚本、一次性输入 复杂的交互式程序、REPL、命令行工具

结论与建议

  • 如果你只是想从用户那里获取一次输入:请毫不犹豫地使用 input(),它简单、安全、足够用。
  • 如果你正在构建一个需要用户多次交互、并希望有良好体验的命令行工具(比如一个数据库客户端、代码调试器等):readline 模块是你的最佳选择,你可以利用它的历史记录、补全等功能,让工具变得专业和易用。
  • input()readline 的关系:在大多数 Unix-like 系统上,Python 的 input() 函数底层就是通过调用 readline 模块来实现的,即使你只用 input(),只要你安装了 readline 库,你就能享受到历史记录和命令行编辑的便利。readline 模块则是在此基础上,提供了更多可以自定义和编程控制的接口。
分享:
扫描分享到社交APP
上一篇
下一篇