Para rellenar la ficha en Python intérprete en OS X Terminal
-
21-08-2019 - |
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.
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")
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.