Pregunta

Hace varios meses, escribí un blog rel="noreferrer"> href="http://igotgenes.blogspot.com/2009/01/tab-completion-and-history-in-python.html" que detalla cómo lograr para rellenar la ficha en el intérprete interactivo de Python estándar - una característica que una vez se pensó sólo está disponible en IPython. He descubierto que es tremendamente útil teniendo en cuenta que a veces tengo que cambiar a la intérprete estándar debido a problemas de Unicode IPython.

Recientemente he hecho un poco de trabajo en OS X. Para mi descontento, no parece el guión de trabajar por la aplicación Terminal de OS X. Estoy esperando que algunos de ustedes con experiencia en OS X podría ser capaz de ayudarme sin problemas disparar para que pueda trabajar en la Terminal, también.

reproduzco el siguiente código

import atexit
import os.path

try:
    import readline
except ImportError:
    pass
else:
    import rlcompleter

    class IrlCompleter(rlcompleter.Completer):
        """
        This class enables a "tab" insertion if there's no text for
        completion.

        The default "tab" is four spaces. You can initialize with '\t' as
        the tab if you wish to use a genuine tab.

        """

        def __init__(self, tab='    '):
            self.tab = tab
            rlcompleter.Completer.__init__(self)


        def complete(self, text, state):
            if text == '':
                readline.insert_text(self.tab)
                return None
            else:
                return rlcompleter.Completer.complete(self,text,state)


    #you could change this line to bind another key instead tab.
    readline.parse_and_bind('tab: complete')
    readline.set_completer(IrlCompleter('\t').complete)


# Restore our command-line history, and save it when Python exits.
history_path = os.path.expanduser('~/.pyhistory')
if os.path.isfile(history_path):
    readline.read_history_file(history_path)
atexit.register(lambda x=history_path: readline.write_history_file(x))

Tenga en cuenta que he editado un poco desde la versión en mi blog para que el IrlCompleter se inicializa con un verdadero pestaña, que parece ser lo que es la salida de la tecla Tab en la Terminal.

¿Fue útil?

Solución

Para evitar tener que utilizar un código más GPL, Apple no incluye una readline real. En su lugar utiliza la licencia BSD libedit , que sólo es en su mayoría de readline-compatibles. Construir su propia Python (o usar Fink o MacPorts) si desea finalizar.

Otros consejos

Esto debería funcionar bajo el pitón del leopardo:

import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")

Mientras que éste no:

import readline, rlcompleter
readline.parse_and_bind("tab: complete")

Guardar en ~ / .pythonrc.py y ejecutar en .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

aquí es una versión multiplataforma completa de carga implementación del tabulador para Windows / OS X / Linux en una sola toma:

#Code  UUID = '9301d536-860d-11de-81c8-0023dfaa9e40'
import sys
try:
        import readline
except ImportError:
        try:
                import pyreadline as readline
        # throw open a browser if we fail both readline and pyreadline
        except ImportError:
                import webbrowser
                webbrowser.open("http://ipython.scipy.org/moin/PyReadline/Intro#line-36")
                # throw open a browser
        #pass
else:
        import rlcompleter
        if(sys.platform == 'darwin'):
                readline.parse_and_bind ("bind ^I rl_complete")
        else:
                readline.parse_and_bind("tab: complete")

http://www.farmckon.net/?p=181

Esto funciona para mí en tanto bash de Linux y OS X 10.4

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')

Si después de probar lo anterior, aún así no funciona, a continuación, tratar de ejecutar en el shell:

sudo easy_install readline

A continuación, cree ~ / .profile archivo con el contenido:

export PYTHONSTARTUP=$HOME/.pythonrc.py

y ~ / .pythonrc.py archivo con el contenido:

try:
    import readline
except:
    print ("Module readline is not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

Gracias a Steven Bamford para la punta easy_install, y Nicolas para el contenido del archivo.

La forma en que se ha documentado decir libedit (Mac OS semi-readline) de la real es:   si "libedit" en readline doc .:      pasar el caso # Mac   más:      pasar el caso readline de GNU #

Después de estrellarse en muchos temas relacionados con Python (2 y 3) en FreeBSD, por fin tiene una extensión adecuada para trabajar utilizando libedit directamente como la más completa para Python.

El problema básico con libedit / readline es que la terminación y la entrada del pitón fue fuertemente inclinada hacia GNU readline ... Por desgracia, esto no es en realidad una buena interfaz particular. Se requiere un número gigante de variables globales en C y no funciona bien en una base de "ejemplo".

Solución:

https://github.com/mark-nicholson/python-editline

Esta es una verdadera extensión pitón separado que vincula directamente a libedit utilizando el "libedit" interfaz real -. No el pegamento readline en el lado

Lo he probado bastante a fondo en Ubuntu, FreeBSD, OpenBSD, NetBSD y MacOS - los resultados se publicarán en el readme. El código C es muy limpio y tiene prácticamente ningún bit dependientes de plataforma - a diferencia del módulo readline.c en Python

.

Notas:     Funciona en python3> 3.2.     No es una gota en el reemplazo para la 'importación readline' en otros guiones, pero estos scripts se puede ajustar fácilmente.     Puede coexistir con readline.so - no hay código de un archivo sitecustomize.py que permite la selección.     Se puede utilizar una distribución 'libedit.so', una costumbre construido uno o libedit integrado en la propia extensión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top