pythonオブジェクトをpythonインタプリタ(unixで)に設定する方法を知っています。
Pythonで書かれたコマンドラインプログラムで、任意のアイテムのタブ/自動補完を有効にする方法を知る必要があります。
私の特定のユースケースは、コマンドラインpython電子メールを送信する必要があるプログラムです。ユーザーがその一部を入力すると、電子メールアドレスを自動補完できます(ディスクにアドレスがあります) (および、オプションでTabキーを押します)。
私はそれがWindowsやMacで動作する必要はなく、Linuxだけです。
Pythonのreadline
バインディングを使用します。例えば、
import readline
def completer(text, state):
options = [i for i in commands if i.startswith(text)]
if state < len(options):
return options[state]
else:
return None
readline.parse_and_bind("tab: complete")
readline.set_completer(completer)
公式の モジュールドキュメント はそれほど詳細ではありません。詳細は readline docs を参照してください。
cmd documentation に従ってください。
import cmd
addresses = [
'[email protected]',
'[email protected]',
'[email protected]',
]
class MyCmd(cmd.Cmd):
def do_send(self, line):
pass
def complete_send(self, text, line, start_index, end_index):
if text:
return [
address for address in addresses
if address.startswith(text)
]
else:
return addresses
if __== '__main__':
my_cmd = MyCmd()
my_cmd.cmdloop()
タブ->タブ->送信->タブ->タブ-> f->タブの出力
(Cmd)
help send
(Cmd) send
[email protected] [email protected] [email protected]
(Cmd) send [email protected]
(Cmd)
あなたはあなたの質問で「インタプリタではない」と言うので、python readlineなど)を含む答えは望まないと思います。(edit:後知恵で、それは明らかにそうではありません。うーん、この情報は面白いと思うので、ここに残しておきます。)
this の後かもしれません。
これは、任意のコマンドにシェルレベルの補完を追加して、bashのタブ補完を拡張することです。
簡単に言えば、可能な補完を生成するシェル関数を含むファイルを作成し、/etc/bash_completion.d/
に保存し、コマンドcomplete
で登録します。リンクされたページからの抜粋は次のとおりです。
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
この場合、foo --[TAB]
と入力すると、変数opts
の値が得られます。つまり、--help
、--verbose
、および--version
です。目的のために、opts
に入れる値を本質的にカスタマイズする必要があります。
リンクされたページの例を見てください、それは非常に簡単です。
私は誰もargcompleteについて言及していないことに驚いています、ここにドキュメントの例があります:
from argcomplete.completers import ChoicesCompleter
parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss'))
parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))
Ephemient here (ありがとう)から非常に提供された完全なバージョンのコードを次に示します。
import readline
addrs = ['[email protected]', '[email protected]', '[email protected]']
def completer(text, state):
options = [x for x in addrs if x.startswith(text)]
try:
return options[state]
except IndexError:
return None
readline.set_completer(completer)
readline.parse_and_bind("tab: complete")
while 1:
a = raw_input("> ")
print "You entered", a
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc
Pythonでインタラクティブなコマンドラインアプリケーションを構築するためのライブラリである Python Prompt Toolkit を使用してみてください。
このライブラリにより、インタラクティブなオートコンプリート機能を簡単に追加できるため、ユーザーは Tab 利用可能な選択肢を視覚的に循環させるキー。ライブラリはクロスプラットフォームです(Linux、OS X、FreeBSD、OpenBSD、Windows)。例:
(画像ソース: pcgli )
投稿された回答は正常に機能しますが、私は職場で書いたオートコンプリートライブラリをオープンソース化しました。本番環境でしばらく使用しており、高速で安定しており、使いやすいです。デモモードも備えているので、単語を入力するときに何が得られるかをすばやくテストできます。
それをインストールするには、単に実行します:pip install fast-autocomplete
以下に例を示します。
>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(Word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(Word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(Word='barrito', max_cost=3, size=3) # mis-spelling
[['burrito']]
チェックアウト: https://github.com/wearefair/fast-autocomplete ソースコード用。
そして、それがどのように機能するかの説明があります: http://zepworks.com/posts/you-autocomplete-me/
スペルミスを処理し、オプションでWordの重みでソートします。 (burrito
がbook
よりも重要だとすると、burrito
に高い「カウント」を与えると、結果でbook
の前に最初に表示されます。
単語は辞書であり、各単語にはコンテキストを設定できます。たとえば、「カウント」、Wordの表示方法、Wordの他のコンテキストなど。この例では、単語にはコンテキストがありませんでした。