2

サブコマンドを処理して「ヘルプ」を提供できるコマンドラインプログラムを開発したいと思います。具体的には、「cgent」という単一のスクリプトがあり、サブコマンド「abc」、「def」、および「xyz」を実行して、残りのsys.argsを受け入れてoptparseで処理したいとします。

cgentabc[オプション]
cgent help abc
...。

サブコマンド名をハードコーディングすれば、これはすべて簡単です。ただし、クラスまたはモジュール(?)を追加することで、引き続きサブコマンドを追加できるようにしたいと思います。これは、たとえば、コントローラーを追加するためにWebフレームワークで使用される考え方に似ています。私はパイロンを掘り下げて、そこで行われていることを再現できるかどうかを確認しようとしましたが、論理を解明していません。これを行う方法について何か提案はありますか?

ありがとう、ショーン

4

2 に答える 2

4

引数の複雑な解析を行う必要がない場合は、ベイカーモジュールをお勧めします。デコレータを介してサブコマンドとその引数を定義できます。例えば:

#!/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()

foo2つのサブコマンドとbaz、を(オプションの)パラメーターaとで定義しますb。したがって、次のように使用できます。

$ ./test_baker.py foo --a 2
foo: 2
$ ./test_baker.py baz
baz: 1

また、docstringを使用してヘルプを生成します。

bakerモジュールはグローバルであるため、サブコマンドは複数のファイルにまたがることができます.py。インポートされている限り、サブコマンドは自動的に登録されます。

さらに、それはただ1つの.pyファイルなので、ソースツリーにドロップするだけです。

于 2011-01-09T23:05:04.047 に答える
1

「コマンドレジストリ」を作成する必要があります。これは辞書のように簡単です。

メインプログラムでは、次のことを行います。

commands = {}

そして、あなたが追加するサブモジュールでは、

from yourmodule.main import commands

def mynewcommand(arguments=here):
    pass

commands['newcommand'] = mynewcommand

次に、argparseを使用してコマンドを処理できます。この場合、モジュールはコマンドのサブパーサー部分も追加する必要があります。

于 2011-01-09T22:55:07.053 に答える