3

サブパーサーでargparseを使用して3つの関数を切り替えようとしていますが、1つの位置引数はすべてのサブパーサーに共通する必要があります。さらに、それが重要なポイントですが、これは出力ファイルパスであるため、提供される最後の引数として位置引数を配置したいと思います。それを最初に置くのは意味がありません(最初の引数として)

import sys,argparse,os

files = argparse.ArgumentParser(add_help=False)
files.add_argument('outfile',  help='output mesh file name')

parser = argparse.ArgumentParser(description="A data interpolation program.",prog='data_interpolate.py',    parents=[files])

subparsers = parser.add_subparsers(help='Mode command.')
command_parser = subparsers.add_parser('cmd',help='Pass all argument in command line.',parents=[files])
command_parser.add_argument('-min', dest='MINFILE',help='Input file with min values', required=True)
command_parser.add_argument('-max', dest='MAXFILE',help='Input file with min values', required=True)
command_parser.add_argument('u', help='Interpolation parameter. Float between 0 and 1. Out of bound values are limited to 0 or 1.')

subparsers.add_parser('py',help='Pass all argument in python file.',parents=[files])
subparsers.add_parser('json',help='Pass all argument in json file.',parents=[files])

これにより、次のことが得られます。

data_interpolation.py -h 

usage: data_interpolation.py [-h] outfile {cmd,py,json}

しかし、私の意見では、アウトファイルは最後に次のように指定する必要があります。

data_interpolation.py [-h] {cmd,py,json} outfile

cmd コマンドを使用すると、他のパラメーター値を渡す必要があるため、これはさらに意味があります。たとえば:

data_interpolation.py cmd -min minfile.txt -max maxfile.txt 0.6 outfile.txt

このような動作をするように argparse を設定するにはどうすればよいですか?

4

2 に答える 2

0

(注 - これは古い質問です)。

位置記号の順序は、それらが定義されている順序によって決まります。これには、subparsers引数 (選択肢と特別なアクションを持つ定位置) が含まれます。

outfileメインパーサーとサブパーサーの両方に引数として 定義するのは冗長です。

via で定義されたポジショナルparentsが最初に配置されます。したがって、「outfile」を最後にする必要がある場合は、サブパーサーごとに個別に定義する必要があります。

メインパーサーの位置として最後に指定することもできます (サブパーサー定義の後)。

In [2]: p=argparse.ArgumentParser()    
In [5]: sp=p.add_subparsers(dest='cmd')
In [6]: spp=sp.add_parser('cmd1')
In [7]: spp.add_argument('test')
In [8]: p.add_argument('out')
In [9]: p.print_help()
usage: ipython [-h] {cmd1} ... out
...

In [11]: spp.print_help()
usage: ipython cmd1 [-h] test
...

In [15]: p.parse_args('cmd1 test out'.split())
Out[15]: Namespace(cmd='cmd1', out='out', test='test')

cmd1サブパーサーの選択として解釈されます。 testサブパーサーによって定位置として解釈されます。 out残り、メインのパーサーに返されて、必要に応じて使用されます。サブパーサーがエクストラを返さない場合、この解析は混乱する可能性があります。したがって、このような最終的な位置指定を指定することには注意が必要です。

于 2014-04-08T23:54:31.767 に答える