создание массива из параметра командной строки (python :: optparse)

Существует сценарий python, который считывает имя теста из командной строки следующим образом:

-b benchname1

Код для этой цели:

import optparse
import Mybench
parser = optparse.OptionParser()
# Benchmark options
parser.add_option("-b", "--benchmark", default="", help="The benchmark to be loaded.")
if options.benchmark == 'benchname1':
  process = Mybench.b1
elif options.benchmark == 'benchname2':
  process = Mybench.b2
else:
  print "no such benchmark!"

я хочу создать массив тестов для этой командной строки:

-b benchname1 benchname2

Итак, «процесс» должен быть массивом, который:

process[0] = Mybench.b1
process[1] = Mybench.b2

Есть какие-нибудь предложения по этому поводу?

Спасибо


person mahmood    schedule 06.10.2011    source источник


Ответы (3)


Если у вас установлен Python 2.7+, вы можете использовать модуль argparse вместо optparse.

import argparse

parser = argparse.ArgumentParser(description='Process benchmarks.')
parser.add_argument("-b", "--benchmark", default=[], type=str, nargs='+',
                    help="The benchmark to be loaded.")

args = parser.parse_args()
print args.benchmark

Пример запуска скрипта -

$ python sample.py -h
usage: sample.py [-h] [-b BENCHMARK [BENCHMARK ...]]

Process benchmarks.

optional arguments:
  -h, --help            show this help message and exit
  -b BENCHMARK [BENCHMARK ...], --benchmark BENCHMARK [BENCHMARK ...]
                        The benchmark to be loaded.

$ python sample.py -b bench1 bench2 bench3
['bench1', 'bench2', 'bench3']
person ronakg    schedule 06.10.2011

Вы можете принять список, разделенный запятыми, для таких названий тестов

-b benchname1,benchname2

Затем обработайте список, разделенный запятыми, в своем коде, чтобы сгенерировать массив -

bench_map = {'benchname1': Mybench.b1,
             'benchname2': Mybench.b2,
            }
process = []

# Create a list of benchmark names of the form ['benchname1', benchname2']
benchmarks = options.benchmark.split(',')

for bench_name in benchmarks:
    process.append(bench_map[bench_name])
person ronakg    schedule 06.10.2011
comment
я должен удалить мой if, elif, else then? - person mahmood; 06.10.2011
comment
ок, нашел. В bench_map нет необходимости. Я пропускаю варианты через разделенный «,» список, а затем разделяю их в соответствии с тем, что вы сказали. Наконец, я добавляю их в процесс с помощью process.append (bench_name) спасибо :) - person mahmood; 06.10.2011

person    schedule
comment
чем использовать его как my.py --skip a --skip b - person rezna; 06.10.2011
comment
Я использовал --skip benchname1 --skip benchname2, но получаю эту ошибку: AttributeError: экземпляр Values ​​не имеет атрибута "benchmark". Он указывает на то, что options.benchmark == 'benchname1': Вы имели в виду, что я заменил '-b' на '-s'? - person mahmood; 06.10.2011