Pergunta

Alguns meses atrás, eu escrevi um href="http://igotgenes.blogspot.com/2009/01/tab-completion-and-history-in-python.html" rel="noreferrer"> blogue detalhando como conseguir guia-conclusão no interpretador interativo padrão Python - uma característica que eu pensava só está disponível em IPython. Eu achei extremamente útil dado que eu às vezes tem que mudar para o intérprete padrão devido a questões unicode ipython.

Recentemente eu fiz algum trabalho no OS X. Para meu descontentamento, o script não parece trabalho para a aplicação Terminal do OS X. Eu estou esperando que alguns de vocês com experiência em OS X pode ser capaz de me ajudar trouble-shoot-lo para que ele possa trabalhar no Terminal, também.

Eu estou reproduzindo o código abaixo

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

Note que eu tenho ligeiramente editado a partir da versão no meu blog para que o IrlCompleter é inicializado com um verdadeiro guia, que parece ser o que é emitido pela tecla Tab no Terminal.

Foi útil?

Solução

Para evitar ter que usar mais código GPL, a Apple não inclui um readline real. Em vez disso, usa a licença BSD libedit , que é apenas principalmente-readline compatível. Construir o seu próprio Python (ou uso Fink ou MacPorts) se quiser conclusão.

Outras dicas

Isso deve funcionar sob python do Leopard:

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

Considerando que este não faz:

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

Save-lo em ~ / .pythonrc.py e executar no .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

aqui é uma versão de plataforma cruzada cheia de conclusão de tabulação carregamento para Windows / Mac OS X / Linux em um único tiro:

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

A partir http://www.farmckon.net/?p=181

Isso funciona para mim, tanto o bash Linux e OS X 10.4

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

Se depois de tentar o acima, ele ainda não funcionar, tente executar no shell:

sudo easy_install readline

Em seguida, crie ~ / .profile arquivo com o conteúdo:

export PYTHONSTARTUP=$HOME/.pythonrc.py

e ~ / .pythonrc.py arquivo com o conteúdo:

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

Graças à Steven Bamford para a ponta easy_install e Nicolas para o conteúdo do arquivo.

A maneira documentada para dizer libedit (o semi-readline Mac OS) do real é: se "libedit" em readline doc .: passar o caso # Mac outro: passar caso readline # GNU

Depois de bater em muitas questões relacionadas com Python (2 e 3) no FreeBSD, eu finalmente consegui uma extensão adequada ao trabalho usando libedit diretamente como a completer para Python.

A questão básica com libedit / readline é que a conclusão ea entrada do Python foi fortemente curvada em direção GNU readline ... Infelizmente, este não é realmente um particularmente boa interface. Ela exige um número gigante de globals em C e não funciona bem em uma base "instância".

Solução:

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

Esta é uma verdadeira extensão python separado que diretamente links para libedit usando a interface real "libedit." - não a cola readline no lado

Eu testei isso muito bem no Ubuntu, FreeBSD, OpenBSD, NetBSD e MacOS - resultados são afixados no readme. O c-código é muito limpo e tem praticamente nenhum bit dependentes da plataforma -. Ao contrário do módulo readline.c em Python

Notas: Ele funciona em Python3> 3.2. Não é um substituto para o 'readline importação' em outros scripts, mas esses scripts podem ser facilmente ajustada. Ele pode coexistir com readline.so - não é o código para um arquivo sitecustomize.py que permite a seleção. Ele pode usar uma distribuição 'libedit.so', um costume construído um ou libedit construído no próprio extensão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top