6

複数のサーバーまたは単一のサーバーから統計情報を取得するための小さな Python スクリプトを作成しており、OptionParser を使用してコマンド ライン入力を解析しています。

#!/usr/bin/python

import sys
from optparse import OptionParser
...
parser.add_option("-s", "--server", dest="server", metavar="SERVER", type="string", 
                  help="server(s) to gather stats [default: localhost]")
...

私の目標は、次のようなことができるようにすることです

#test.py -s server1 -s server2

そして、何らかの方法で options.server オブジェクト内にこれらの値の両方を追加して、値が 1 であるか 10 であるかに関係なく、それらを繰り返し処理できるようにします。

任意の考え/助けをいただければ幸いです。ありがとう。

4

5 に答える 5

13
import optparse

parser = optparse.OptionParser()
parser.add_option('-t', '--test', action='append')

options, args = parser.parse_args()
for i, opt in enumerate(options.test):
    print 'option %s: %s' % (i, opt)
于 2010-05-03T05:41:31.243 に答える
3

はい、optparse で実行できます。

これは例です:

./test.py --categories=aaa --categories=bbb --categories ccc arg1 arg2 arg3

これは次を印刷します:

arguments: ['arg1', 'arg2', 'arg3']
options: {'categories': ['aaa', 'bbb', 'ccc']}

以下の完全な動作例:

#!/usr/bin/env python

import os, sys
from optparse import OptionParser
from optparse import Option, OptionValueError

VERSION = '0.9.4'

class MultipleOption(Option):
    ACTIONS = Option.ACTIONS + ("extend",)
    STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
    ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)

    def take_action(self, action, dest, opt, value, values, parser):
        if action == "extend":
            values.ensure_value(dest, []).append(value)
        else:
            Option.take_action(self, action, dest, opt, value, values, parser)


def main():
    PROG = os.path.basename(os.path.splitext(__file__)[0])
    long_commands = ('categories')
    short_commands = {'cat':'categories'}
    description = """Just a test"""
    parser = OptionParser(option_class=MultipleOption,
                          usage='usage: %prog [OPTIONS] COMMAND [BLOG_FILE]',
                          version='%s %s' % (PROG, VERSION),
                          description=description)
    parser.add_option('-c', '--categories', 
                      action="extend", type="string",
                      dest='categories', 
                      metavar='CATEGORIES', 
                      help='comma separated list of post categories')

    if len(sys.argv) == 1:
        parser.parse_args(['--help'])

    OPTIONS, args = parser.parse_args()
    print "arguments:", args
    print "options:", OPTIONS

if __name__ == '__main__':
    main()

詳細については、http://docs.python.org/library/optparse.html#adding-new-actionsを参照してください。

于 2012-05-01T21:44:14.007 に答える
2

argparseをチェックしてみてください。それはあなたが一緒に何かをすることができることを意味する「nargs」パラメータを提供します

#test.py -s server1 server2

私はそれが正確に要求されたものではないことを知っていますが、それはあまり面倒なことなくまともな妥協かもしれません。:)

于 2010-05-03T04:29:54.397 に答える
2

サーバーのコンマ区切りリストを受け入れる方が簡単かもしれません:

# test.py -s server1,server2

スクリプト内で値を分割します。

于 2010-05-03T04:40:15.837 に答える
1

これは既知の実際の例です ( http://docs.python.org/library/email-examples.htmlから):

parser.add_option('-r', '--recipient',
                  type='string', action='append', metavar='RECIPIENT',
                  default=[], dest='recipients',
                  help='A To: header value (at least one required)')

使用法は次のようなものだと思います:

python script.py -r some@where.com -r no@where.com -r any@where.com
于 2012-04-07T13:52:12.097 に答える