web-dev-qa-db-ja.com

Python argparseとbashの補完

私もpythonスクリプトの引数でオートコンプリートを取得したいと思います。

私はbash_completionがどのように機能するか(引数の場合)を実際に理解したことはありませんでしたが、掘り下げた後、次のことを理解しました。

  1. 「完了」を使用して完了関数をコマンドにバインドします
  2. すべての完了関数は基本的に引数パーサーのコピーです

特に2番目の点は、自動生成させたいので、あまり良いとは言えません。

最良のことは、シェルがすべてのタブで私のプログラムに何を完了するかを尋ねることですが、これは実際には機能しないという印象を持っていますが、それは正しいですか?

2番目のオプションは、おそらくargparseパーサーから正しく完了するシェル関数へのコンバーターを記述することです。

55
andrea_crotti

恥知らずな自己宣伝: https://github.com/kislyuk/argcomplete

argcompleteは、argparseのbash補完を提供します。

62
weaver

Bash "完了" は本当に素晴らしいです。そして、Pythonで書かれたプログラムにとっては簡単です...

これはまさにあなたが望むものだと思います: optcomplete:Python用のシェル完了自己ジェネレーター 。たとえば、Ubuntuの「python-optcomplete」パッケージとして利用できます。

pythonプログラムに数行を挿入し、ユーザーが(一度だけ)bashの「complete」プログラムを実行して、引数を完了する方法をbashに指示します。

complete -F _optcomplete <program>

そして今、ユーザーは完了しています!デフォルトでは、プログラムオプションを簡単に補完します。特定のオプションで補完がどのように機能するかをカスタマイズする方法については、例を参照してください。それは美しく書かれており、サブコマンド、代替補完オプションなどを処理するために拡張するのは簡単です!

更新:

Zshでの完了(optparseとargparseの両方)については、 genzshcomp 0.3.1を参照してください:Pythonパッケージインデックス

@englebipで述べたように、argparseは廃止されたため、Python 2.7および3.2で導入された新しいoptparseモジュールにも同様のものが必要です。

その方向に進むことについての議論はここにあります:

それがどのように行われるかについてのこの背景も参照してください: どのようにargparse(および非推奨のoptparse)は、pythonプログラム名の後ろの 'tab'キープレスにbashで応答しますか? - スタックオーバーフロー

13
nealmcb