2011-01-09 11 views
2

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

 
cgent abc [options] 
cgent help abc 
.... 

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

おかげで、 ショーン

答えて

1

あなたは "コマンドレジストリ" を作成する必要があります。これは、辞書と同じくらい簡単です。

commands = {} 

そして、あなたは、あなたがコマンドを処理するためにargparseを

from yourmodule.main import commands 

def mynewcommand(arguments=here): 
    pass 

commands['newcommand'] = mynewcommand 

使用することができます追加の任意のサブモジュールで:あなたは、メインプログラムで

。この場合、モジュールはコマンドのサブパーサー部分も追加する必要があります。

3

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

#!/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つのサブコマンドfoobazを定義abパラメータ。 だから、このようにそれらを使用することができます。

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

それはまた助けを生成するためのドキュメンテーション文字列を使用しています。

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

また、ファイルは.pyであるため、ソースツリーにドロップすることができます。

関連する問題