5

多くのアクションを実行するPythonスクリプトを作成したので、多くのオプションがあります。そこで、共通のオプションのグループ化に親パーサーも使用するサブパーサーに分割しました。

すべてのコマンドのヘルプとそのオプションを表示するヘルプオプションが必要ですが、format_helpメソッドをオーバーライドせずに可能ですか?

同様の質問を見ましたが、グループ化は私にとって重要ではありません。そこにオプションが必要なだけです。

例えば:

general_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False)
general_group.add_argument('--threads', action='store_true', default=False)
second_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False)
second_group.add_argument('--sleep', action='store', default=60, type=int)
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group,second_group])
subparsers.add_parser('Start',parents=[general_group])

args = parser.parse_args()

この場合、誰かが./script.py -hを実行すると、ヘルプにスレッドオプションが表示されるようにしたいと思います。

4

1 に答える 1

8

問題は、次の行にあることです。

subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group,second_group])
subparsers.add_parser('Start',parents=[general_group])

サブパーサーに親として追加general_groupしているため、メインパーサーはサブパーサーを認識せず、結果として表示さ./script.py -hれません--threads。すべてのサブパーサーの親として配置する場合は、トップパーサーの親として配置する必要があります。

parser = argparse.ArgumentParser(parents=[general_group])
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[second_group])
subparsers.add_parser('Start')

その結果:

$ python script.py -h
usage: script.py [-h] [--threads] {Restart,Start} ...

positional arguments:
  {Restart,Start}

optional arguments:
  -h, --help       show this help message and exit
  --threads

ただし、この場合、オプションは親パーサーの一部であり、サブパーサーではないことに注意してください。つまり、次のようになります。

$python script.py --threads Start

正しいですが、次のとおりです。

$ python script.py Start --threads
usage: script.py [-h] [--threads] {Restart,Start} ...
script.py: error: unrecognized arguments: --threads

--threadsサブパーサーによって「継承」されていないためです。サブパーサーにも含める必要がある場合は、引数--threadsで指定する必要があります。parents

parser = argparse.ArgumentParser(parents=[general_group])
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group, second_group])
subparsers.add_parser('Start', parents=[general_group])

これはあなたが望むことをするはずです:

$ python script.py -h
usage: script.py [-h] [--threads] {Restart,Start} ...

positional arguments:
  {Restart,Start}

optional arguments:
  -h, --help       show this help message and exit
  --threads
$ python script.py Start -h
usage: script.py Start [-h] [--threads]

optional arguments:
  -h, --help  show this help message and exit
  --threads
于 2013-02-17T13:36:26.253 に答える