Domanda

Diversi mesi fa, ho scritto un postare dettaglio come realizzare scheda di completamento nell'interprete interattivo standard di Python - una caratteristica che si pensava disponibile solo in IPython. Ho trovato estremamente utile dato che io a volte ho dovuto passare l'interprete standard a causa di problemi di unicode ipython.

Recentemente ho fatto qualche lavoro in OS X. Per il mio malcontento, lo script non sembra funzionare per l'applicazione Terminale di OS X. Spero che alcuni di voi con esperienza in OS X potrebbe essere in grado di aiutarmi problemi sparare in modo che possa lavorare in Terminal, pure.

sto riproducendo il codice seguente

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))

Si noti che ho un po 'modificato dalla versione sul mio blog post in modo che il IrlCompleter viene inizializzato con una vera e propria scheda, che sembra essere quello che è uscita dal tasto Tab in Terminale.

È stato utile?

Soluzione

Per evitare di dover utilizzare codice più GPL, Apple non include un vero e proprio readline. Invece utilizza la licenza BSD- libedit , che è compatibile solo per lo-readline-. Costruisci il tuo Python (o usare Fink o MacPorts) se si desidera che il completamento.

Altri suggerimenti

Questo dovrebbe funzionare sotto il pitone del leopardo:

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

considerando che questo non lo fa:

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

Salva in ~ / .pythonrc.py ed eseguire in .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

qui è una versione cross-platform completa di completamento automatico di caricamento per Windows / OS X / Linux in un solo colpo:

#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

Questo funziona per me sia su bash Linux e OS X 10.4

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

Se dopo aver provato quanto sopra, si continua a non funzionare, quindi provare ad eseguire nella shell:

sudo easy_install readline

Quindi, creare ~ / .profile file con il contenuto:

export PYTHONSTARTUP=$HOME/.pythonrc.py

e ~ / .pythonrc.py file con il contenuto:

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

Grazie alla Steven Bamford la punta easy_install, e Nicolas per il contenuto del file.

Il modo documentato per dire libedit (il semi-readline Mac OS) e da quella reale è:   se "libedit" in readline doc .:      passare caso # Mac   altro:      passare caso readline # GNU

Dopo l'incidente in molte questioni che si occupano di Python (2 e 3) su FreeBSD, finalmente ho avuto un'estensione adeguata per lavorare con libedit direttamente come la più completa per Python.

Il problema di base con libedit / readline è che il completamento e l'ingresso di Python è stato fortemente piegata verso GNU readline ... Purtroppo, questo non è in realtà una particolarmente buona interfaccia. Si richiede un numero enorme di variabili globali in C e non funziona bene su una base "istanza".

Soluzione:

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

Si tratta di una vera e propria estensione pitone separato che collega direttamente al libedit utilizzando l'attuale interfaccia di "libedit" -. Non la colla readline sul lato

ho provato abbastanza bene su Ubuntu, FreeBSD, OpenBSD, NetBSD e MacOS - i risultati sono pubblicati nel readme. Il c-codice è molto pulito e non ha praticamente piattaforma bit dipendenti - a differenza del modulo readline.c in Python

.

Note:     Funziona su python3> 3.2.     NON è un rimpiazzo per 'importazione readline' in altri script, ma questi script può essere facilmente regolato.     Può coesistere con readline.so - c'è il codice di un file sitecustomize.py che consente la selezione.     E 'possibile utilizzare una distribuzione 'libedit.so', una su misura uno o libedit integrato nel estensione in sé.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top