1

我编写了一个简单的类似 shell 的程序,它使用 readline 来提供参数的智能完成。我希望该机制支持具有空格并被引用以表示一个参数的参数(就像为 shell 提供这样的参数一样)。

我已经看到 shlex.split() 知道如何解析引用的参数,但是如果用户想要完成中间输入,它会失败(例如:'complete "Hello' 会导致在传递给 shlex 时抛出异常,因为引号不平衡)。

有这样做的代码吗?

谢谢!

4

3 回答 3

2

我不知道该任务的任何现有代码,但如果我要这样做,我会捕获异常,尝试添加一个假的尾随引号,并查看 shlex.split 如何处理如此修改的字符串。

于 2009-08-07T17:11:43.963 回答
1

GNU Readline 允许使用变量rl_completer_quote_characters. 不幸的是,Python 没有在标准库的readline模块上导出该选项(即使在 3.7.1 上,也是撰写本文时的最新版本)。

不过,我找到了一种方法ctypes

import ctypes

libreadline = ctypes.CDLL ("libreadline.so.6")
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
    libreadline, 
    "rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'

请注意,这显然是不可移植的(甚至可能在 Linux 发行版之间,因为 libreadline 版本是硬编码的,但我的计算机上没有纯文本libreadline.so),因此您可能需要根据您的环境对其进行调整。

此外,就我而言,我只将双引号设置为完成功能的特殊用途,因为那是我的用例。

参考

于 2018-12-03T02:34:33.213 回答
0

为了使@caxcaxcoatl 回答更便携,可以将 readline 硬编码版本替换readline.__file__为:

import ctypes
import readline

libreadline = ctypes.CDLL (readline.__file__)
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
    libreadline, 
    "rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'
于 2021-04-16T03:34:32.683 回答