Cómo hacer autocompletar la línea de comandos de Python pero NO solo al principio de una cadena

Python, a través de sus enlaces de línea de lectura, permite una gran autocompletación de la línea de comandos (como se describe aquí ).

Pero, la terminación solo parece funcionar al principio de cadenas. Si desea que coincida con la mitad o el final de una línea de lectura de cadena no funciona.

Me gustaría autocompletar cadenas, en un progtwig de Python de línea de comandos, haciendo coincidir lo que escribo con cualquiera de las cadenas en una lista de cadenas disponibles.

  • Un buen ejemplo del tipo de autocompletado que me gustaría tener es el tipo que ocurre en GMail cuando escribes en el campo Para. Si escribe uno de los apellidos de sus contactos, aparecerá tan bien como si escribió su nombre.
  • Es posible que necesite usar las flechas hacia arriba y hacia abajo o algún otro método para seleccionar entre las cadenas coincidentes (y no es necesario en el caso de readline) y eso está bien en mi caso.
  • Mi caso de uso particular es un progtwig de línea de comandos que envía correos electrónicos.
  • Ejemplos de códigos específicos serían muy útiles.

Usar emuladores de terminal como curses estaría bien. Solo tiene que ejecutarse en linux, no en Mac o Windows.

Aquí hay un ejemplo: Digamos que tengo las siguientes tres cadenas en una lista

['Paul Eden ', 'Eden Jones ', 'Somebody Else '] 

Me gustaría algún código que autocomplete los primeros dos elementos de la lista después de escribir ‘Eden’ y luego me permite elegir uno de ellos (todo a través de la línea de comandos con el teclado).

No estoy seguro de entender el problema. Puede usar readline.clear_history y readline.add_history para configurar las cadenas completas que desee, luego control-r para buscar backword en el historial (como si estuviera en un indicador de shell). Por ejemplo:

 #!/usr/bin/env python import readline readline.clear_history() readline.add_history('foo') readline.add_history('bar') while 1: print raw_input('> ') 

Alternativamente, puedes escribir tu propia versión completa y vincularla con la clave apropiada. Esta versión utiliza el almacenamiento en caché en caso de que su lista de coincidencias sea enorme:

 #!/usr/bin/env python import readline values = ['Paul Eden ', 'Eden Jones ', 'Somebody Else '] completions = {} def completer(text, state): try: matches = completions[text] except KeyError: matches = [value for value in values if text.upper() in value.upper()] completions[text] = matches try: return matches[state] except IndexError: return None readline.set_completer(completer) readline.parse_and_bind('tab: menu-complete') while 1: a = raw_input('> ') print 'said:', a