使用python处理带引号的行';s读线

使用python处理带引号的行';s读线,python,readline,Python,Readline,我已经编写了一个简单的shell程序,它使用readline来提供参数的智能完成。我希望该机制能够支持带有空格的参数,并被引用来表示为一个参数(就像向shell提供这样的参数一样) 我已经看到,shlex.split()知道如何解析带引号的参数,但如果用户希望在键入过程中完成,它会失败(例如:“complete”Hello“将导致在传递给shlex时引发异常,因为引号不平衡) 有这样做的代码吗 谢谢!我不知道该任务有任何现有代码,但如果我要这样做,我会捕获异常,尝试添加一个假尾随引号,看看shl

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

我已经看到,shlex.split()知道如何解析带引号的参数,但如果用户希望在键入过程中完成,它会失败(例如:“complete”Hello“将导致在传递给shlex时引发异常,因为引号不平衡)

有这样做的代码吗


谢谢!

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

GNU Readline允许使用变量
rl\u completer\u quote\u 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
),因此您可能需要根据您的环境对其进行调整

另外,在我的例子中,我只为完成特性设置了双引号,因为这是我的用例

参考资料

  • @艾尔克森的评论

为了使@caxcaxcoatl的回答更具可移植性,可以用
readline替换readline硬编码版本。\uuuu文件\uuuuuuuuuu
,它将是:

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 = '"'

我已经考虑过了,但我想看看是否有不那么难看的东西。因为那样你就必须试着在两个词中加上“或”,等等,而这并不是。。。漂亮:)它不漂亮,因为用例看起来相当复杂。今天就这样实现,因为没有其他选择。@abyx,是的,一点不漂亮总比一个问题没有解决好,我同意!