使用python的readline处理带引号的行

时间:2009-08-07 17:08:28

标签: python readline

我编写了一个简单的类shell程序,它使用readline来提供参数的智能完成。我希望该机制支持具有空格的参数,并引用它们作为一个参数(如同提供shell一样)。

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

是否有执行此操作的代码?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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),因此您可能必须针对环境进行调整

另外,就我而言,我仅将双引号设置为完成功能的特殊字符,因为这是我的用例。

参考

答案 2 :(得分: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 = '"'