Обработка строк с кавычками с использованием Python readline - PullRequest
1 голос
/ 07 августа 2009

Я написал простую подобную оболочке программу, которая использует readline, чтобы обеспечить умное завершение аргументов. Я хотел бы, чтобы механизм поддерживал аргументы, которые имеют пробелы и заключены в кавычки для обозначения одного аргумента (как при предоставлении оболочки с таким).

Я видел, что shlex.split () знает, как анализировать аргументы в кавычках, но в случае, если пользователь хочет завершить ввод текста в середине, это не удается (например: «complete» Hello »вызовет исключение, когда из-за несбалансированных кавычек).

Есть ли код для этого?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 августа 2009

Я не знаю ни одного существующего кода для задачи, но если бы я сделал это, я бы поймал исключение, попытался бы добавить поддельную конечную кавычку и посмотреть, как shlex.split делает с измененной строкой.

0 голосов
/ 03 декабря 2018

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 на моем компьютере), поэтому вам, возможно, придется адаптировать его для вашей среды. 1010 *

Кроме того, в моем случае я установил только двойные кавычки как особые для функции завершения, как это было в моем случае использования.

Ссылки

...