返回

Python 命令行程序的自动完成详解

Linux

## Python 命令行程序的自动完成指南

在 Python 解释器中设置自动完成相对容易,但如果你需要在命令行程序中实现任意内容的自动完成,情况就会变得更加复杂。本文将提供一个全面的指南,帮助你轻松解决这一问题。

### 启用 Readline 库

第一步是安装和导入 Readline 库,它为命令行编辑和历史记录提供自动完成功能。在 Linux 系统上,你可以使用以下命令进行安装:

sudo apt-get install libreadline-dev

然后在你的 Python 脚本中导入 Readline:

import readline

### 设置自动完成函数

Readline 允许你指定一个函数来处理自动完成。这个函数将接受一个部分完成的命令行作为参数,并返回一个可能的完成列表。

对于自动完成电子邮件地址,你可以创建以下完成函数:

def email_completer(text, state):
    # 读取包含电子邮件地址的文件
    with open('email_addresses.txt') as f:
        addresses = f.readlines()

    # 筛选出与输入内容匹配的地址
    matches = [addr for addr in addresses if addr.startswith(text)]

    # 返回第一个匹配项或之后的完成
    if state == 0:
        return matches[0]
    else:
        return matches[state]

### 激活自动完成

将完成函数设置为 Readline 的 completer 属性,并启用自动完成:

readline.set_completer(email_completer)
readline.parse_and_bind('tab: complete')

### 示例用法

假设你的 email_addresses.txt 文件包含以下电子邮件地址:

john@example.com
jane@example.org
jack@example.net

当你运行程序并输入以下内容时:

python my_program jo

按 Tab 键将自动完成电子邮件地址 "john@example.com"。

### 常见问题解答

1. 如何关闭自动完成?

执行 readline.set_completer(None) 即可关闭自动完成。

2. 我可以自定义自动完成的触发方式吗?

是的,你可以使用 readline.set_completion_key() 设置触发自动完成的键。

3. 如何在自动完成列表中显示?

可以使用 readline.set_completion_display_matches_hook() 设置一个函数来显示。

4. 自动完成是否适用于 Python 3?

是的,Readline 库在 Python 3 中受支持。

5. 有其他自动完成库可以使用吗?

有,例如 argparseclick,它们提供更高级的命令行处理功能,包括自动完成。