用argparse解析多个相同的参数组

时间:2019-05-20 22:30:34

标签: python argparse

我在这里的argparse帖子中进行了很多搜索,但实际上找不到与我遇到的问题相关的任何内容。 我需要解析一个将多个图像及其可选特征作为输入的命令行。 例如,我想解析这样的命令行:

image_tool.py -n 3 image_1 -c green -y 3 image_2 -x 2 -y 7 image_3 -c black -x 10

我在下面的测试程序中得到的输出是正确的。

('green', '3', '3')
('red', '2', '7')
('black', '10', '5')

但是问题是当我尝试获得刚刚得到的帮助时:

$image_tool.py -h
usage: image_tool [-h] [-n NUM_IMAGES] [-m MODE]

optional arguments:
  -h, --help            show this help message and exit
  -n NUM_IMAGES, --num_images NUM_IMAGES  Number of Images
  -m MODE, --mode MODE  Tool mode

没有提及image_ *参数或子解析器。即使使用image_tool.py image_1 -h,我也会得到相同的输出。 有谁知道如何获得图像处理者的帮助?理想情况下,我想使用image_tool.py -h

获取所有参数的帮助

我还想知道我是否在这里滥用子解析器功能。有谁对实现相同功能有更好的建议?参数组,不同的解析器库,...?看起来我需要的是用于子解析器的“附加”功能,该功能可创建命名空间列表。 一种更简单的方法可能是使用图像信息解析json文件,但是现在我仅限于命令行。

谢谢!

import argparse

parser = argparse.ArgumentParser(prog='image_tool')
parser.add_argument('-n', '--num_images', dest='num_images', type=int, action='store', default='2', help='Number of Images')
parser.add_argument('-m', '--mode', action='store', dest='mode', help="Tool mode")

options, argv = parser.parse_known_args()
subparsers = parser.add_subparsers(help='sub-help', dest='sp_image')

for i in range(0,options.num_images+1):
    sp= subparsers.add_parser('image_%i'%i, help='image help')
    sp.add_argument("-c", "--color", action="store", dest='color', default='red', help="Color")
    sp.add_argument("-x", "--width", action="store", dest='width', default='3', help="Width")
    sp.add_argument("-y", "--height", action="store", dest='height', default='5', help="Height")

image = []
while argv:
    print('Remaining command line ', argv)
    # Only use one image to allow duplicates
    try:
        index = [idx for idx, s in enumerate(argv[1:]) if s.startswith('image_')][0]
    except IndexError:
        #last one
        index = idx+1
    opt = parser.parse_args(argv[:index+1])
    # Cut off first image from command line
    argv = argv[index+1:]
    image.append(opt)
    if not opt.sp_image:
        break

# Test code
for img in image:
    print (img.color, img.width, img.height)

0 个答案:

没有答案