update para mac python macos configuration interpreter tab-completion

para - uninstall python mac



Finalización de tabulación en el intérprete de Python en el terminal OS X (7)

Aquí hay una versión multiplataforma completa de la finalización de la pestaña de carga 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")

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

Hace varios meses, escribí una publicación en el blog en la que se detallaba la forma de completar las pestañas en el intérprete interactivo estándar de Python, una función que antes creía que solo estaba disponible en IPython. Lo encontré tremendamente útil dado que a veces tengo que cambiar al intérprete estándar debido a los problemas de IPython Unicode.

Recientemente he trabajado en OS X. Para mi descontento, el script no parece funcionar para la aplicación Terminal de OS X. Espero que algunos de ustedes con experiencia en OS X puedan ayudarme a resolver problemas para que pueda funcionar en Terminal, también.

Estoy reproduciendo 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 lo he editado levemente de la versión en la publicación de mi blog para que el IrlCompleter se IrlCompleter con una pestaña verdadera, que parece ser lo que se IrlCompleter con la tecla Tab en la Terminal.


Después de chocar con muchos problemas relacionados con Python (2 y 3) en FreeBSD, finalmente conseguí una extensión adecuada para trabajar con libedit directamente como el completador de Python.

El problema básico con libedit / readline es que la finalización y entrada de Python estaban muy inclinadas hacia la línea de lectura de GNU ... Lamentablemente, esta no es una interfaz particularmente buena. Requiere un número gigante de globales en C y no funciona bien en una "instancia".

Solución:

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

Esta es una verdadera extensión de Python separada que se vincula directamente a libedit mediante la interfaz real "libedit", no el pegamento readline en el lateral.

Lo he probado bastante a fondo en Ubuntu, FreeBSD, OpenBSD, NetBSD y MacOS. Los resultados se publican en el archivo Léame. El código c es muy limpio y prácticamente no tiene bits dependientes de la plataforma, a diferencia del módulo readline.c en Python.

Notas: Funciona en Python3> 3.2. NO es un reemplazo directo para ''importar readline'' en otros scripts, pero esos scripts se pueden ajustar fácilmente. Puede coexistir con readline.so; existe un código para un archivo sitecustomize.py que permite la selección. Puede usar una distribución ''libedit.so'', una compilación personalizada o libedit integrada en la propia extensión.


Esto debería funcionar bajo la pitón de Leopard:

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

Considerando que este no lo hace:

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

Guárdelo en ~ / .pythonrc.py y ejecute en .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py


Esto me funciona tanto en Linux bash como en OS X 10.4

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


La forma documentada de diferenciar libedit (la semi-línea de lectura de Mac OS) de la real es: si "libedit" está en línea de lectura. doc : pass # Mac case else: pass # GNU readline case


Para evitar tener que usar más código GPL, Apple no incluye una línea de lectura real. En su lugar, utiliza el libedit licencia libedit , que solo es en su mayoría compatible con readline. Construye tu propio Python (o usa Fink o MacPorts) si quieres completarlo.


Si después de probar lo anterior, todavía no funciona, intente ejecutar en el shell:

sudo easy_install readline

Luego, crea el archivo ~ / .profile con el contenido:

export PYTHONSTARTUP=$HOME/.pythonrc.py

y un archivo ~ / .pythonrc.py 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 por la sugerencia de instalación fácil, y Nicolas por el contenido del archivo.