0

runプラグインクラスのメソッドのプロキシとして機能するスクリプトを書いています。

スクリプトは次のように呼び出されます。

> main.py -v --plugin=Foo --extra=bar -c

このコマンドの結果は、次と同等になります。

plugin = my.module.Foo()
plugin.run(extra='bar', c=True)

前にあるもの--pluginはすべてmain.pyによって内部的に使用され、プラグインには渡されないことに注意してください。それ以降--pluginはmain.pyによって無視され、代わりにプラグインに直接渡されます。

私が遭遇している問題は、許可されたオプションのリストを指定せずgetoptに解析できるようなクラスが見つからないことです。argv

getopt1行をコメントアウトして書き直す必要はありません。そこにもっと良いオプションはありますか?

4

5 に答える 5

3

必要なものはargparseライブラリにあります。http ://docs.python.org/dev/library/argparse.html#partial-parsingを参照してください。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
于 2011-07-28T01:23:02.993 に答える
0

あなたは愚かなことをすることができ、あなたが各アイテムをどうするかを決定するためにあなたがキーなどを調べることができる辞書を生成するだけです...

#!/usr/bin/python
import sys 
options = dict()
for pair in map(lambda item: item.lstrip('-'), sys.argv[1:]):
    pair = pair.split('=')
    if len(pair) < 2:
        option, val = pair[0], True
    else:
        option, val = pair
    options[option] = val 
print options
于 2011-07-27T23:57:46.003 に答える
0

あなたは運がいいです。私はまさにそれを行う修正されたgetoptを書きました。ただし、1つの制限は、短いオプションが長いオプションの前になければならないということです。それは修正できるかもしれません。

于 2011-07-28T01:44:59.307 に答える
0

getopt私はちょうどそれが遭遇した場合に解析を停止することを--発見しました:

Python 2.6.6 (r266:84292, Jun 16 2011, 16:59:16) 
Type "help", "copyright", "credits" or "license" for more information.
>>> from getopt import getopt
>>>
>>> argv = ['-v', '--plugin=foo', '--', '--extra=bar', '-c']
>>> opts, extra = getopt(argv, 'v', 'plugin=')
>>>
>>> opts
[('-v', ''), ('--plugin', 'foo')]
>>>
>>> extra
['--extra=bar', '-c']

上記argvは呼び出しと同等であることに注意してください。

> main.py -v --plugin=Foo -- --extra=bar -c

このソリューションが特に気に入っているのは、ユーザーがパラメーターを並べ替える方法に少し柔軟性を持たせるためです。

于 2011-07-28T03:23:38.287 に答える
-1

正規表現を使用してを検索し'plugin=、見つかった場合は行を分割し、getoptを使用して各半分を解析します。

于 2011-07-28T01:26:47.117 に答える