Question

Il y a plusieurs mois, je l'ai écrit un poster détaillant comment obtenir des tabulations achèvement l'interpréteur interactif Python standard - une fonctionnalité que je pense que, une fois disponible en IPython. Je l'ai trouvé étant donné que j'ai parfois énormément pratique pour passer à l'interprète la norme en raison de problèmes ipython unicode.

Récemment, je l'ai fait un peu de travail dans OS X. Pour mon mécontentement, le script ne semble pas fonctionner pour l'application Terminal de Mac OS X. J'espère que certains d'entre vous avec une expérience dans OS X pourrait être en mesure de me aider Dépanner afin qu'il puisse travailler dans le terminal, ainsi.

Je reproduis ci-dessous le code

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

Notez que je l'ai un peu édité de la version sur mon blog afin que l'initialisation avec IrlCompleter un onglet vrai, ce qui semble être ce qui est sortie par la touche Tab dans le Terminal.

Était-ce utile?

La solution

Pour éviter d'avoir à utiliser un code plus GPL, Apple ne comprend pas un vrai readline. Au contraire, il utilise la licence BSD libedit , qui est seulement la plupart du temps-readline compatible. Construisez votre propre Python (ou utilisez Fink ou MacPorts) si vous voulez la fin.

Autres conseils

Cela devrait fonctionner sous le python de Leopard:

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

Alors que celui-ci ne fait pas:

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

Enregistrer dans ~ / .pythonrc.py et exécuter dans .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

ici est une version multi-plateforme complète de l'onglet chargement terminé pour Windows / OS X / Linux en un seul coup:

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

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

Cela fonctionne pour moi sur bash Linux et OS X 10.4

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

Si après avoir essayé ce qui précède, il ne fonctionne toujours pas, essayez d'exécuter dans le shell:

sudo easy_install readline

Ensuite, créez ~ / .profile fichier avec le contenu:

export PYTHONSTARTUP=$HOME/.pythonrc.py

et ~ / .pythonrc.py fichier avec le contenu:

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

Merci Steven Bamford la pointe easy_install, et Nicolas pour le contenu du fichier.

La façon de dire documentée libedit (Mac OS semi-readline) à partir du réel est le suivant:   si "libedit" dans readline doc .:      passer # cas Mac   autre:      passer le cas # GNU readline

Après le crash dans de nombreuses questions ayant trait à Python (2 et 3) sur FreeBSD, j'ai finalement obtenu une bonne extension au travail en utilisant libedit directement comme completer pour Python.

La question de base avec libedit / readline est que l'achèvement de Python et l'entrée était fortement courbé vers GNU readline ... Malheureusement, cela est en fait pas une interface particulièrement bonne. Il a besoin d'un nombre gigantesque de GLOBALS en C et ne fonctionne pas sur une base « instance ».

Solution:

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

Ceci est une véritable extension de python séparé qui relie directement à l'aide de la Libedit réelle interface « libedit » -. Pas la colle readline sur le côté

Je l'ai testé assez à fond sur Ubuntu, FreeBSD, OpenBSD, NetBSD et Mac OS - les résultats sont affichés dans le readme. Le code C est très propre et n'a pratiquement pas de bits dépendant de la plate-forme - à la différence du module de readline.c dans le python

.

Notes:     Il fonctionne sur python3> 3.2.     Il ne remplace pas de drop-in pour « readline d'importation » dans d'autres scripts, mais ces scripts peut être facilement réglé.     Il peut coexister avec readline.so - il y a code pour un fichier sitecustomize.py qui permet la sélection.     Il peut utiliser une distribution « libedit.so », une coutume construit un ou libedit intégré dans l'extension elle-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top