OS XターミナルでのPythonインタプリタでタブ補完
-
21-08-2019 - |
質問
数ヶ月前、私はのブログを書きました私は一度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")
このの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」を使用することができます。