質問

数ヶ月前、私はのブログを書きました私は一度IPythonでのみ利用できると思った機能を - 標準のPython対話インタプリタでタブ補完を実現する方法を詳述するポスト。私は時々原因IPythonのUnicodeの問題のために、標準のインタプリタへの切り替えを持っていることを与えられ、それは途方もなく便利なことがわかりました。

最近、私は私の不満にOS Xのいくつかの作業を行ってきた、このスクリプトは、OS Xのターミナルアプリケーションで動作するようには思えません。私はOS Xでの経験を持つあなたのいくつかは、トラブルシュート、それは同様に、ターミナルで作業することができますので、それを私を助けることができるかもしれない願っています。

私は以下のコードを再現しています。

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

IrlCompleterがターミナルでTabキーで出力が何であるかのようだ真のタブで初期化されるように、私は少し私のブログの記事にバージョンから、それを編集したことに注意してください。

役に立ちましたか?

解決

より多くのGPLコードを使用することを避けるために、Appleは本当のreadlineが含まれていません。その代わりに、BSDライセンスののlibedit の、唯一のほとんどが-readlineの互換性があります使用しています。あなたが完了したい場合は、独自のPythonをビルドします(またはフィンクまたはMacPortsのを使用します)。

他のヒント

これはLeopardのパイソンの下で動作するはずます:

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

この1つはないのに対します:

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

〜/ .pythonrc.pyでそれを保存して、.bash_profileの中で実行します。

export PYTHONSTARTUP=$HOME/.pythonrc.py

ここではワンショットで、Windows / OS X / Linux用のローディングタブ補完の完全なクロスプラットフォームのバージョンがあります:

#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する

こののLinuxのbashとOS X 10.4

の両方で私の作品
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')

上記を試した後で、それはまだ動作しない場合は、シェルで実行してみます:

sudo easy_install readline

次に、作成の〜/ .profileにのコンテンツを持つファイル:

export PYTHONSTARTUP=$HOME/.pythonrc.py

の〜/ .pythonrc.py のコンテンツを持つファイル:

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

スティーブン・バンフォードのおかげでのためをeasy_installを先端は、およびニコラスは、ファイルの内容のためを。

実際のいずれかからのlibedit(Mac OSのセミのreadlineを)伝えるための文書化の方法は次のとおりです。   。readlineの中 "のlibedit" のドキュメントの場合:      #マックケースをクリア   他:      

#GNUのreadlineのケースをクリア

は、FreeBSD上のPython(2及び3)を扱う多くの問題に衝突した後、私は最終的にPython用コンプリータとして直接libeditのを使用して動作するように適切な拡張子を持っています。

のlibedit / readlineの持つ基本的な問題は、Pythonの完了と入力はGNUのreadlineを向けて大きく曲がったことがある...悲しいことに、これは実際には特に優れたインタフェースではありません。これは、Cでグローバルの巨大な数を必要とし、「インスタンス」ベースでうまく動作しません。

ソリューション:

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

これは、直接、実際の「libeditの」インターフェース使用のlibeditへのリンク真別Pythonの拡張である - 側ないreadlineの接着剤を

私はUbuntuの、FreeBSDの、OpenBSDの、NetBSDのとMacOSでかなり徹底的にテストしている - その結果はREADMEに掲載されています。 Cコードは非常にクリーンであり、実質的にプラットフォームに依存ビット持っていない - 。Pythonでreadline.cモジュールとは異なり、を

注:     それはのpython3> 3.2で動作します。     これは、他のスクリプトで「インポートのreadline」のドロップイン置換されていませんが、これらのスクリプトを容易に調整することができます。     それはreadline.soと共存することができます - 選択を可能にsitecustomize.pyファイルのコードがあります。     それは、拡張子自体に組み込ま一つまたはlibeditのを建てカスタムを配布「libedit.so」を使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top