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

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

有没有代码可以做到这一点?

谢谢!

#1楼 票数:2 已采纳

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

#2楼 票数: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 ),因此您可能需要根据您的环境调整它。

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

参考

#3楼 票数: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 = '"'

  ask by abyx translate from so

未解决问题?本站智能推荐:

3回复

为什么在python循环中,在使用readline之前,文件中的行没有遍历所有行?

为什么在python循环中,在使用readline之前,文件中的行没有遍历所有行? 在读取循环的某些行后将如何遍历文件中的所有行,如何实现?
1回复

Python:Readline在10行后返回错误

我正在尝试在for循环中对文件使用readline。 问题是我开始遇到I / O错误。 似乎经过10条阅读线后出现I / O错误。 这是我的功能: 这是捕获的打印异常: 我认为这个问题不能由其他使用过的函数引起,所以我不在这里附加它们。 我以为这是由使用的文件引起的,但是当我尝
2回复

Python:如何正确使用readline()和readlines()

我已经按照Gödel,Escher和Bach提供的图表,构建了一个Python脚本,使用来自Princeton English Wordnet的数据随机创建句子。 调用python GEB.py会产生英语无意义的句子列表,例如: 复苏的麻醉费用。 苔藓植物指甲。 第四十号桃子。 星空
3回复

使用readline在python中读取文件时跳过空白行

我的程序解析不同类型的日志文件,其中一些在文件开头带有空行。 在此程序中,获取第一行的变量非常重要。 我已经想出了如何使其跳过空白行,但我无法使其将带有文本的第一行视为真正的第一行。 我的代码如下 之后,我需要一个else语句,该语句使first_line =文件的第二行。 谢谢。
1回复

使用Python中的sys.stdin.readline从stdin读取非常大的行

在尝试将程序编写为某些规范时,包括要求程序从stdin读取信息并将输出打印到stdout ,我遇到了一个意想不到的问题。 问题是sys.stdin.readline()没有完成读取stdin上提供给它的行。 最小的例子 要阅读的行可在http://pastebin.com/k3DsD5
1回复

在python3.4中使用readline()

我正在搜索一个说“我的系统”的关键字,因此readline将搜索该关键字并复制该关键字所在的段落。 我需要在要打印的段落的每一行之前添加“#”符号,下面给出的代码只为我添加了“#”的第一行。 如何在该特定段落的每一行之前添加“#”。 请帮忙
3回复

使用append()和readline在python中完成

具体来说,我可以在Python中提供append()Null / None值吗? 我试图将自动完成功能添加到命令行应用程序,因此要使用readline获取用户可能在raw_input提示符下键入的任何内容。 当我尝试使用Tab键(未在控制台中输入任何值)并收到此消息时,我遇到了一个问题:
2回复

使用python2.7在Windows上的Readline功能

我需要在用 python 编写的程序中导入 readline 功能。 我目前使用的是 2.7 版,而我所看到的第 3 方软件包仅适用于 2.6 版。 有谁知道带有 Python 2.7 的 Windows 的第 3 方 readline 包吗?