Pythonのコマンドラインプログラムの「コマンド」を自動的に登録する
-
09-10-2019 - |
質問
サブコマンドに「ヘルプ」を処理して提供できるコマンドラインプログラムを開発したいと思います。具体的には、「cgent」という単一のスクリプトがあり、サブコマンド「ABC」、「def」、および「xyz」がsys.argsの残りの部分を実行して受け入れたいとします。
cgent abc [options] cgent help abc ....
サブコマンド名をハードコードすると、これはすべて簡単です。ただし、クラスまたはモジュール(?)を追加して、サブコマンドを追加し続けることができます。これは、たとえば、コントローラーを追加するためにWebフレームワークで使用されるアイデアに似ています。パイロンを掘り下げて、そこで何が行われているかを再現できるかどうかを確認しましたが、論理を解明していません。これを行う方法についての提案はありますか?
ありがとう、ショーン
解決
「コマンドレジストリ」を作成する必要があります。これは辞書と同じくらい簡単です。
メインプログラムでは:
commands = {}
そして、あなたが追加するサブモジュールで
from yourmodule.main import commands
def mynewcommand(arguments=here):
pass
commands['newcommand'] = mynewcommand
その後、Argparseを使用してコマンドを処理できます。その場合、モジュールはコマンドのサブパーサーパーツを追加する必要があります。
他のヒント
あなたが議論の複雑な解析をする必要がない場合私は ベイカー モジュール。デコレータを通じてサブコマンドとその議論を定義できます。例えば:
#!/usr/bin/env python
import baker
@baker.command()
def foo(a=1):
print 'foo:', a
@baker.command()
def baz(b=1):
print 'baz:', b
baker.run()
2つのサブコマンドを定義します foo
と baz
, 、(オプションの)パラメーターを使用します a
と b
。したがって、次のように使用できます。
$ ./test_baker.py foo --a 2
foo: 2
$ ./test_baker.py baz
baz: 1
また、Docstringsを使用してヘルプを生成します。
以来 baker
モジュールはグローバルであり、サブコマンドはいくつかに及ぶことがあります .py
ファイル。それらが輸入されている限り、サブコマンドは自動的に登録されます。
さらに、それはほんの一点です .py
ファイルをファイルして、ソースツリーにドロップできるようにします。