2013-03-19 12 views
5

インフラストラクチャを管理するための一連のスクリプトとモジュールを構築しています。組織を整理するために、できるだけ多くの労力を集約し、より新しいスクリプト用のボイラープレートを最小限にしたいと思います。複数のカスタムモジュールにバックアップされた複数のスクリプトでPythonのargparseを使用

特に、ここでの問題は、ArgumentParserモジュールを統合することです。

構成例は、このような何かを整理するスクリプトやライブラリを持っていることです:script2loggerlib2を利用するだろうが、このシナリオscript1

|-- bin 
    |-- script1 
    |-- script2 
|-- lib 
    |-- logger 
    |-- lib1 
    |-- lib2 

は、loggerlib1を利用することができます。どちらの場合でも、私はロガーに '-v'と '-d'を受け入れるようにしたいのに対して、script1は追加のargsとlib2の他のargを受け入れることもできます。私はこれが衝突につながる可能性があり、手動でそれを管理することを認識しています。

SCRIPT1

#!/usr/bin/env python 
import logger 
import lib1 
argp = argparse.ArgumentParser("logger", parent=[logger.argp]) 

スクリプト2

#!/usr/bin/env python 
import logger 
import lib2 

ロガー

#!/usr/bin/env python 
import argparse 
argp = argparse.ArgumentParser("logger") 
argp.add_argument('-v', '--verbose', action="store_true", help="Verbose output") 
argp.add_argument('-d', '--debug', action="store_true", help="Debug output. Assumes verbose output.") 

各スクリプトとlibコuldはそれ自身の引数を持つ可能性がありますが、これらはすべて最終的な1つのarg_parse()に統合する必要があります。

これまでの試みでは、argpの設定を継承/拡張できませんでした。これをライブラリファイルとスクリプトの間でどうやって行うことができますか?

+0

あなたはargparse parents = [parser1、parser2]の機能がうまく機能していないと言います。 – babbageclunk

答えて

6

最も簡単な方法は、ArgumentParserインスタンスを受け入れ、それに独自の引数を追加するメソッドを各モジュールに持たせることです。

# logger.py 
def add_arguments(parser): 
    parser.add_argument('-v', '--verbose', action="store_true", help="Verbose output") 
    # ... 

# lib1.py 
def add_arguments(parser): 
    parser.add_argument('-x', '--xtreme', action="store_true", help="Extremify") 
    # ... 

各スクリプトは、彼らのArgumentParserを作成する引数を提供し、各モジュールにそれを渡し、その後、独自の特定の引数を追加します。

# script1.py 
import argparse, logger, lib1 
parser = argparse.ArgumentParser("script1") 
logger.add_arguments(parser) 
lib1.add_arguments(parser) 
# add own args... 
関連する問題