如何使用python3 cmd库允许包含空格的参数?

时间:2019-05-02 18:12:30

标签: python-3.x user-input

我正在使用cmd库来创建具有代码完成功能的简单命令行界面。当命令参数包含特殊字符时,会出现问题。代码补全仅在由这些特殊字符分隔的最后一部分上运行。

下面是测试它的简单代码:

class Test(Cmd):
    def complete_test(self, text, line, b, e):
    print(text)
    print(line)
    print(b)
    print(e)

键入test和包含例如斜杠的参数。 /中仅包含text之后的最后一部分,如果您返回某些内容,则仅替换此最后一部分。

我在this答案下使用了注释来解决其他特殊字符的问题。但是我不能只做readline.set_completer_delims(""),因为代码完成不起作用。我至少需要将空间设置为定界符(readline.set_completer_delims(" ")),以便它的代码完成可以找到参数从何处开始。但是现在我无法传递包含空格的路径(请参见下面的完成代码):

def complete_export(self, text:str, line:str, begidx, endidx):
    return [x for x in glob(text + "*") if x.startswith(text)]

我的export命令只需要一个参数-路径,因此理想的行为是将第一个空格视为参数的开头,而其他空格将视为路径的一部分。

注意:我已经意识到可以使用line参数并手动提取路径,但是代码完成仍将仅替换最后一部分,因此必须对路径进行编辑。我将此作为答案提交,但这不是很好的解决方案。

1 个答案:

答案 0 :(得分:0)

这里是手动将路径与line分开的解决方案,执行globing,并在存在空格之后仅返回路径的一部分。一个问题是,如果路径中包含空格,则如果按两次Tab键,则只会得到空格后其余文本的建议。根据使用情况,这可能是个问题。

def complete_export(self, text:str, line:str, begidx, endidx):
    path = line[line.find(" ")+1:]  # get everything after space
    return [" ".join(x.split(" ")[(line.count(" ") - 1):]) for x in glob(path + "*")]  # completion suggestions after last space