Pergunta

Escrevi um programa simples semelhante ao shell que usa o ReadLine para fornecer a conclusão inteligente de argumentos. Gostaria do mecanismo para apoiar argumentos que tenham espaços e são citados para significar como um argumento (como fornecer ao shell isso).

Eu vi que shlex.split () sabe como analisar argumentos citados, mas, caso um usuário queira concluir o meio do tipo falha (por exemplo: 'Complete' Hello 'causaria uma exceção a ser lançada quando passada para o Shlex , por causa de citações desequilibradas).

Existe código para fazer isso?

Obrigado!

Foi útil?

Solução

Não conheço nenhum código existente para a tarefa, mas se eu fizesse isso, pegou a exceção, tente adicionar uma cotação falsa e ver como o shlex.split faz com a string assim modificada.

Outras dicas

GNU readline permite esse cenário com a variável rl_completer_quote_characters. Infelizmente, Python não exporta essa opção na biblioteca padrão readline Módulo (mesmo em 3.7.1, o mais recente até o momento em que esteve).

Eu encontrei uma maneira de fazer isso com ctypes, no entanto:

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

Observe que isso claramente não é portátil (possivelmente até entre distritos Linux, pois a versão Liberadline é codificada, mas eu não tinha simples libreadline.so no meu computador), então você pode precisá -lo para o seu ambiente.

Além disso, no meu caso, defina apenas cotações duplas como especiais para o recurso de conclusão, pois esse era o meu caso de uso.

Referências

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top