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

input()函数:这是最常用、最简单的方式,它从标准输入(通常是键盘)读取一行,并自动移除行尾的换行符\n,返回一个字符串。readline模块:这是一个更底层的模块,它提供了对 GNUreadline库的接口(在 Linux 和 macOS 上是原生支持的,在 Windows 上需要额外安装),它功能非常强大,支持命令行编辑(如方向键移动光标)、历史记录(上下箭头查看之前的输入)等功能。
对于绝大多数简单的脚本,input() 就足够了,当你需要构建一个交互式命令行工具,希望有类似 Bash 那样的体验时,readline 模块就是你的不二之选。
简单的 input() 函数
这是最基础、最常用的方法。
特点:
- 内置函数,无需导入任何模块。
- 读取一行输入,自动去掉结尾的换行符。
- 返回一个字符串。
示例代码:

# 提示用户输入名字
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() 类似,但它不会自动移除行尾的换行符。
示例代码:

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("再见!")
运行示例:
- 第一次运行,输入
2+2,得到结果: 4。 - 然后按上箭头键,会看到
2+2重新出现在命令行。 - 按回车键,再次得到
结果: 4。 - 输入
3*5,得到结果: 15。 - 再次按上箭头,会先看到
3*5,再按一次上箭头,会看到2+2。 - 输入
exit退出程序。 - 下次再运行这个脚本,之前输入的
2+2和3*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模块则是在此基础上,提供了更多可以自定义和编程控制的接口。
