从命令行选项 (Python::optparse) 创建一个数组

4

有一个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”应该是一个数组,格式如下:
process[0] = Mybench.b1
process[1] = Mybench.b2

你能提供一些建议吗?

谢谢

3个回答

8
如果您有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']

4
    self.opt_parser.add_argument('-s', '--skip',
        default=[],
        type=str,
        help='A name of a project or build group to skip. Can be repeated to skip multiple projects.',
        dest='skip',
        action='append')

然后将其用作“my.py --skip a --skip b”。 - rezna
我使用了"--skip benchname1 --skip benchname2",但是出现了这个错误:"AttributeError: Values instance has no attribute 'benchmark'"。它指向的那一行是"if options.benchmark == 'benchname1':"。你的意思是我应该用"-s"代替"-b"吗? - mahmood

1

您可以像这样接受逗号分隔的基准名称列表

-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])

我应该删除我的“if,elif,else”吗? - mahmood
好的,我找到了。没有必要使用“bench_map”。我通过逗号分隔的列表传递选项,然后按照您说的拆分它们。最后,我将它们附加到“process.append(bench_name)”中以处理。谢谢 :) - mahmood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接