2017-01-26 6 views
1

私はPythonで​​モジュールを使用してコマンドラインインターフェイスを作成しようとしていますが、私の引数の1つについてはヘルプメッセージに問題があります。引数が1つの引数(ファイル名)または3つの引数(ファイル名、列、列)のいずれかを取る必要がありますので、私はそれに近づいどのようにこれは次のようになります。その後、nargs = '+'のとき、どのように[...]のヘルプメッセージが表示されないようにしますか?

parser = argparse.ArgumentParser() 
parser.add_argument('--score', nargs ='+', help='score file, default X Y = 2 4', 
    metavar='FILENAME X Y') 
args = parser.parse_args() 

とのif-else:

if len(args.score) == 1: 
    data = open(args.score[0]) 
    S1 = 1 
    S2 = 3 
elif len(args.score) == 3: 
    data = open(args.score[0]) 
    S1 = int(args.score[1]) - 1 
    S2 = int(args.score[2]) - 1 
else: 
    print('Error: --score incorrect number of arguments called') 

-h, --help   show this help message and exit 
    --score FILENAME X Y [FILENAME X Y ...] 
         score file, default X Y = 2 4 

と私は括弧の部分が離れて行きたい:しかし、私のヘルプメッセージは、次のようになります

-h, --help   show this help message and exit 
    --score FILENAME X Y score file, default X Y = 2 4 

EDIT
は、ここで私はANSIエスケープコードを使用して、いえハック回避策として、修正プログラムを実装することを選んだ方法は次のとおりです。

parser.add_argument('--score', nargs ='+', help='\x1b[A\b\b\b\b\b\b X Y \x1b[1C\b score file, default X Y = 2 4', 
    metavar=('FILENAME', '')) 

が出力に

usage: test.py [-h] [--score FILENAME [...]] 

optional arguments: 
    -h, --help   show this help message and exit 
    --score FILENAME X Y score file, default X Y = 2 4 

を与えてくれてありがとうmetavarタプルのアイデアのために@hpauljに渡します。

答えて

0

ヘルプは次のとおりです。

usage: ipython3 [-h] [--score SCORE [SCORE ...]] 

optional arguments: 
    -h, --help   show this help message and exit 
    --score SCORE [SCORE ...] 
         score file, default X Y = 2 4 

SCORE LONGNAME由来、および'%s [%s ...]' % get_metavar(2)フォーマットされています。

私は2つの項目のタプルにmetavarを変更した場合、彼らはNARGS = 3でSCORE

usage: ipython3 [-h] [--score NAME [XY ...]] 

optional arguments: 
    -h, --help   show this help message and exit 
    --score NAME [XY ...] 
         score file, default X Y = 2 4 

のこれら2つのインスタンスを置き換える、私はmetavarでこれらの言葉を与え、得ることができる:

usage: ipython3 [-h] [--score NAME X Y] 
.... 
2つの引数に入力が与えられること

分割

In [774]: parser.add_argument('--FILENAME', help='score file', metavar='NAME'); 
In [775]: parser.add_argument('--XY', nargs=2, help='x,y'); # type=int 
In [776]: parser.print_help() 

usage: ipython3 [-h] [--FILENAME NAME] [--XY XY XY] 

optional arguments: 
    -h, --help  show this help message and exit 
    --FILENAME NAME score file 
    --XY XY XY  x,y 

============

def _format_args(self, action, default_metavar): 
    get_metavar = self._metavar_formatter(action, default_metavar) 
    .... 
    elif action.nargs == ONE_OR_MORE: 
     result = '%s [%s ...]' % get_metavar(2) 
    ... 
:=====

実際のフォーマットはHelpFormatter._format_args方法によって製造されます

0

あなたがやっていることは、コマンドラインインターフェイスの世界では非常に非標準です。引数の構文を再設計する必要があります。代わりに、これらの二つをサポートする:

--score FILENAME 
--score FILENAME X Y 

あなたはこれらの選択肢のいずれかを検討する必要があります。

--score FILENAME [-x X] [-y Y] 
--score FILENAME[=X,Y] 

どちらも標準のコマンドライン引数解析ライブラリを使用してサポートすることが容易になります。 metavarなし

関連する問題