que - raw_input python ejemplos
TerminaciĆ³n de la pestaƱa en el raw_input de Python() (2)
Sé que puedo hacer esto para obtener el efecto de completar la pestaña en Python seguro.
import readline
COMMANDS = [''extra'', ''extension'', ''stuff'', ''errors'',
''email'', ''foobar'', ''foo'']
def complete(text, state):
for cmd in COMMANDS:
if cmd.startswith(text):
if not state:
return cmd
else:
state -= 1
readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input(''Enter section name: '')
Ahora estoy interesado en completar la pestaña con directorios. (/ home / usuario / doc> pestaña)
¿Cómo voy a hacer tal tarea?
Este es un ejemplo rápido de cómo realizar la finalización incremental de las rutas del sistema de archivos. He modificado su ejemplo, organizándolo en una clase donde los métodos denominados complete_[name]
indican comandos de nivel superior.
He cambiado la función de finalización para usar el búfer interno de línea de lectura para determinar el estado de la finalización general, lo que hace que la lógica de estado sea un poco más simple. La finalización de la ruta está en el _complete_path(path)
, y he conectado el comando adicional para realizar las terminaciones de la ruta en sus argumentos.
Estoy seguro de que el código podría simplificarse aún más, pero debería proporcionarle un punto de partida decente:
import os
import re
import readline
COMMANDS = [''extra'', ''extension'', ''stuff'', ''errors'',
''email'', ''foobar'', ''foo'']
RE_SPACE = re.compile(''.*/s+$'', re.M)
class Completer(object):
def _listdir(self, root):
"List directory ''root'' appending the path separator to subdirs."
res = []
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isdir(path):
name += os.sep
res.append(name)
return res
def _complete_path(self, path=None):
"Perform completion of filesystem path."
if not path:
return self._listdir(''.'')
dirname, rest = os.path.split(path)
tmp = dirname if dirname else ''.''
res = [os.path.join(dirname, p)
for p in self._listdir(tmp) if p.startswith(rest)]
# more than one match, or single match which does not exist (typo)
if len(res) > 1 or not os.path.exists(path):
return res
# resolved to a single directory, so return list of files below it
if os.path.isdir(path):
return [os.path.join(path, p) for p in self._listdir(path)]
# exact file match terminates this completion
return [path + '' '']
def complete_extra(self, args):
"Completions for the ''extra'' command."
if not args:
return self._complete_path(''.'')
# treat the last arg as a path and complete it
return self._complete_path(args[-1])
def complete(self, text, state):
"Generic readline completion entry point."
buffer = readline.get_line_buffer()
line = readline.get_line_buffer().split()
# show all commands
if not line:
return [c + '' '' for c in COMMANDS][state]
# account for last argument ending in a space
if RE_SPACE.match(buffer):
line.append('''')
# resolve command to the implementation function
cmd = line[0].strip()
if cmd in COMMANDS:
impl = getattr(self, ''complete_%s'' % cmd)
args = line[1:]
if args:
return (impl(args) + [None])[state]
return [cmd + '' ''][state]
results = [c + '' '' for c in COMMANDS if c.startswith(cmd)] + [None]
return results[state]
comp = Completer()
# we want to treat ''/'' as part of a word, so override the delimiters
readline.set_completer_delims('' /t/n;'')
readline.parse_and_bind("tab: complete")
readline.set_completer(comp.complete)
raw_input(''Enter section name: '')
Uso:
% python complete.py
Enter section name: ext<tab>
extension extra
Enter section name: extra foo<tab>
foo.py foo.txt foo/
Enter section name: extra foo/<tab>
foo/bar.txt foo/baz.txt
Enter section name: extra foo/bar.txt
Actualizar completará las rutas desde la raíz si el usuario escribe /
:
% python complete.py
Enter section name: extra /Use<tab>
/Users/.localized /Users/Shared/ /Users/user1 /Users/user2
Enter section name: extra /Users/use<tab>
/Users/user1 /Users/user2
Esto es suficiente para habilitar la finalización integrada de la pestaña del directorio con raw_input ():
import readline
readline.parse_and_bind("tab: complete")