Frage

Vor einigen Monaten schrieb ich ein Blog Post beschreiben, wie Tab-Vervollständigung in den Standard-Python-Interpreter interaktiv zu erreichen - ein Feature, wenn ich dachte, nur in IPython verfügbar. Ich habe es ungeheuer praktisch gefunden gegeben, dass ich manchmal zu den Standard-Interpreter wechseln muß aufgrund IPython Unicode-Probleme.

Vor kurzem habe ich einige Arbeiten in OS X. Um meine Unzufriedenheit getan, das Skript scheint nicht für OS X Terminal-Anwendung zu arbeiten. Ich bin einige von Ihnen mit Erfahrung in OS X gehofft, mir zu helfen, es könnte die Lage sein, problemlos zu schießen, so dass es im Terminal arbeiten kann, wie gut.

Ich reproduzieren Sie den Code unten

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

Beachten Sie, dass ich es leicht von der Version auf meiner Blog-Post bearbeitet habe, so dass der IrlCompleter mit einem echten Register initialisiert wird, das, was zu sein scheint, ausgegeben durch die Tab-Taste im Terminal ist.

War es hilfreich?

Lösung

Um zu vermeiden, mehr GPL-Code zu verwenden, die von Apple nicht eine echte Readline- umfassen. Stattdessen verwendet es die BSD-Lizenz libedit , die nur meist-Readline--kompatibel ist. Bauen Sie Ihre eigene Python (oder benutzen Sie Fink oder MacPorts), wenn Sie Abschluss möchten.

Andere Tipps

Dies sollte unter Leopard Python arbeiten:

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

Während dies nicht:

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

Speichern Sie es in ~ / .pythonrc.py und führen in Bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

Hier ist eine vollständige Cross-Plattform-Version von Lade Tabulatorvervollständigung für Windows / O X / Linux in einem Schuss:

#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

Das ist für mich funktioniert sowohl unter Linux bash und OS X 10.4

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

Wenn nach der oben versuchen, es immer noch nicht funktioniert, dann versuchen Sie in der Shell ausführen:

sudo easy_install readline

Dann erstellen ~ / .profile Datei mit dem Inhalt:

export PYTHONSTARTUP=$HOME/.pythonrc.py

und ~ / .pythonrc.py Datei mit dem Inhalt:

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

Dank die easy_install Spitze und Nicolas für den Inhalt der Datei.

Die dokumentierte Weise libedit (der Mac OS halb Readline-) aus dem echten zu sagen ist:   wenn "libedit" in Readline- doc .:      geben # Mac Fall   sonst:      geben # GNU readline- Fall

Nach vielen Fragen Absturz in Python zu tun (2 und 3) auf FreeBSD, Ich habe endlich eine richtige Erweiterung libedit direkt als completer für Python arbeitete mit.

Das Grundproblem mit libedit / Readline- ist, dass Pythons Fertigstellung und Eingabe stark gebogen in Richtung GNU readline- war ... Leider ist dies eigentlich keine besonders gute Schnittstelle. Es erfordert eine riesige Zahl von Globals in C und funktioniert nicht gut auf eine „Instanz“ -Basis.

Lösung:

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

Dies ist eine wahre separate Python-Erweiterung, die direkt Links libedit der eigentlichen „libedit“ Schnittstelle -. Nicht Readline- Klebern auf der Seite

Ich habe es ziemlich gründlich auf Ubuntu, FreeBSD, OpenBSD, NetBSD und MacOS getestet - Ergebnisse sind in der readme geschrieben. Der c-Code ist sehr sauber und hat praktisch keine plattformabhängigen Bits - im Gegensatz zu dem readline.c Modul in Python

.

Weitere Informationen:     Es funktioniert auf Python3> 3.2.     Es ist nicht ein Drop-in-Ersatz für ‚Import Readline-‘ in anderen Skripten, sondern können diese Skripte einfach eingestellt werden.     Es kann koexistieren mit readline.so - es Code für eine sitecustomize.py Datei ist, die die Auswahl ermöglicht.     Es kann eine Verteilung verwenden ‚libedit.so‘, eine speziell angefertigten eine oder libedit in die Verlängerung selbst gebaut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top