-2

私はいくつかの文字列置換を組み込むことに取り組んでおり、現在引数は を使用してスクリプトに渡されますsys.argv[i]。sys を docopt に置き換えたいのですが、これまでのところドキュメントが比較的不明確であることがわかりました。

私のコードが現在動作する方法は

filename.py -param_to_replace new_param_value

(複数のパラメーターを含めて置き換えることもできます)

これは次にによって処理されます

if len(sys.argv) > 1:
    for i in range((len(sys.argv)-1) / 2):
        params[sys.argv[1+2*i].split('-')[1]] = float(sys.argv[1+2*i+1])

ここで、params は一連の定義済みパラメーターの名前です。

これをdocoptで動作させることができるはずだと思いますが、これまでのところ、私が持っているものはもっと似ています

"""Docopt test
Usage:
  filename.py --param_name1 <val> --param_name2 <val>

  filename -h | --help
  filename --version

Options:
  -h --help     Show this screen.
  --param_name1 Change some param we call param_name1, all other params changed in similar way


"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='filename 1.0')
    print(arguments)

しかし、これは何も渡さず、公式ドキュメントで提供されている詳細の終わりのようです。docopt に詳しい人は、コマンドライン引数をより効果的に渡す方法を知っていますか? または、この後に sys.argv を「arguments」に置き換える必要がありますか?

ありがとう!

4

4 に答える 4

0

使用する代わりに(とにかく素晴らしい)、 :docoptの dict を作成したいだけの場合は、docopt が返されたように、辞書内包表記を使用してこれを行うことができます (現在行っていることよりもわかりやすい方法で推測します):-paramvalue

if __name__ == '__main__':
    if len(sys.argv) > 1:
        args = sys.argv[1:]
        assert len(args) % 2 == 0
        arguments = {args[i][1:]: args[i+1] for i in range(0, len(args), 2)}
        print(arguments)

次にテストします。

In [12]: runfile(
             'test.py', wdir='/home/mgc',
              args='-param_to_replace1 new_value1 -param_to_replace2 new_param_valu2')

{'param_to_replace2': 'new_param_valu2', 'param_to_replace1': 'new_value1'}
于 2016-01-22T22:25:47.737 に答える