9

通常、サブパーサーを追加するには、次のargparseことを行う必要があります。

parser = ArgumentParser()
subparsers = parser.add_subparser()
subparser = subparsers.add_parser()

私が抱えている問題は、メイン スクリプトのサブコマンドとして、独自のパーサーを備えた別のコマンド ライン スクリプトを追加しようとしていることです。これを行う簡単な方法はありますか?


編集:明確にするために、script.py次のようなファイルがあります。

def initparser():
    parser = argparse.ArgumentParser()
    parser.add_argument('--foo')
    parser.add_argument('--bar')
    return parser

def func(args):
    #args is a Namespace, this function does stuff with it

if __name__ == '__main__':
    initparser().parse_args()

だから私はこれを次のように実行できます:

python script.py --foo --bar

いくつかのサブコマンドを備えたコマンドラインインターフェイスであるモジュールを作成しようとしているapp.pyので、次のようなものを実行できます。

python app.py script --foo --bar

initparser()すべてのロジックを にコピー アンド ペーストするのではなく、app.pyinitparser() から作成したパーサーをサブパーサーとして直接使用できるようにしたいと考えています。これは可能ですか?

4

3 に答える 3

9

parentsパラメータを使用できます

p=argparse.ArgumentParser()
s=p.add_subparsers()
ss=s.add_parser('script',parents=[initparser()],add_help=False)
p.parse_args('script --foo sst'.split())

ssに対して定義されたすべての引数を共有するパーサーですinitparseradd_help=Falseis needed on either ssor initparsersoは-h2 回定義されていません。

于 2013-08-31T01:53:34.830 に答える
0

実際には意図されていないことをハックしようとしているように聞こえるので、shlexモジュールを確認することをお勧めします。ArgumentParser

そうは言っても、解析しようとしているのが正確に何であるかの例がなければ、良い答えを見つけるのは少し難しいです。

于 2013-02-20T19:39:17.760 に答える
0

あなたの問題は、argparse の宣言型ラッパーで解決できると思います。私が書いたものはArghと呼ばれます。これは、コマンドの定義 (すべての引数関連のものを含む) をアセンブル (サブパーサーを含む) およびディスパッチから分離するのに役立ちます。

于 2014-01-17T20:34:25.070 に答える