web-dev-qa-db-ja.com

インタプリタではなく、Python、コマンドラインプログラムを任意の自動補完する方法

pythonオブジェクトをpythonインタプリタ(unixで)に設定する方法を知っています。

  • Googleは、これを行う方法についての説明で多くのヒットを示しています。
  • 残念なことに、非常に多くの参照があり、私がやるべきことを見つけるのは困難です。これはわずかに異なります。

Pythonで書かれたコマンドラインプログラムで、任意のアイテムのタブ/自動補完を有効にする方法を知る必要があります。

私の特定のユースケースは、コマンドラインpython電子メールを送信する必要があるプログラムです。ユーザーがその一部を入力すると、電子メールアドレスを自動補完できます(ディスクにアドレスがあります) (および、オプションでTabキーを押します)。

私はそれがWindowsやMacで動作する必要はなく、Linuxだけです。

82
Paul D. Eden

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 を参照してください。

57
ephemient

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)
57
Florian Bösch

あなたはあなたの質問で「インタプリタではない」と言うので、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に入れる値を本質的にカスタマイズする必要があります。

リンクされたページの例を見てください、それは非常に簡単です。

34
Owen

私は誰も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'))
23
qed

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
12
Paul D. Eden
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc
9
user178047

Pythonでインタラクティブなコマンドラインアプリケーションを構築するためのライブラリである Python Prompt Toolkit を使用してみてください。

このライブラリにより、インタラクティブなオートコンプリート機能を簡単に追加できるため、ユーザーは Tab 利用可能な選択肢を視覚的に循環させるキー。ライブラリはクロスプラットフォームです(Linux、OS X、FreeBSD、OpenBSD、Windows)。例:

pgcli - Python Prompt Toolkit

(画像ソース: pcgli

1
Flux

投稿された回答は正常に機能しますが、私は職場で書いたオートコンプリートライブラリをオープンソース化しました。本番環境でしばらく使用しており、高速で安定しており、使いやすいです。デモモードも備えているので、単語を入力するときに何が得られるかをすばやくテストできます。

それをインストールするには、単に実行します: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の重みでソートします。 (burritobookよりも重要だとすると、burritoに高い「カウント」を与えると、結果でbookの前に最初に表示されます。

単語は辞書であり、各単語にはコンテキストを設定できます。たとえば、「カウント」、Wordの表示方法、Wordの他のコンテキストなど。この例では、単語にはコンテキストがありませんでした。

0
Seperman