16

私はしばらくの間 optparse を使用しており、構成ファイルから引数をロードする機能を追加したいと考えています。

これまでのところ、私が考えることができる最高のものは、引数がハードコードされたラッパーバッチスクリプトです...不格好に思えます。

これを行う最もエレガントな方法は何ですか?

4

6 に答える 6

23

構成ファイルを使用するという S.Lott のアイデアには同意しますが、独自のソリューションではなく、組み込みのConfigParser (3.0 の configparser) モジュールを使用して解析することをお勧めします。

以下は、ConfigParser とoptparseの動作を示す簡単なスクリプトです。

import ConfigParser
from optparse import OptionParser

CONFIG_FILENAME = 'defaults.cfg'

def main():
    config = ConfigParser.ConfigParser()
    config.read(CONFIG_FILENAME)

    parser = OptionParser()
    parser.add_option("-l",
                      "--language",
                      dest="language",
                      help="The UI language",
                      default=config.get("Localization", "language"))
    parser.add_option("-f",
                      "--flag",
                      dest="flag",
                      help="The country flag",
                      default=config.get("Localization", "flag"))

    print parser.parse_args()

if __name__ == "__main__":
    main()

出力:

(<Values at 0x2182c88: {'flag': 'japan.png', 'language': 'Japanese'}>, [])

" " で実行parser.py --language=French:

(<Values at 0x2215c60: {'flag': 'japan.png', 'language': 'French'}>, [])

ヘルプが組み込まれています。" parser.py --help" で実行:

Usage: parser.py [options]

Options:
  -h, --help            show this help message and exit
  -l LANGUAGE, --language=LANGUAGE
                        The UI language
  -f FLAG, --flag=FLAG  The country flag

構成ファイル:

[Localization]
language=Japanese
flag=japan.png
于 2009-12-10T12:23:42.620 に答える
7

argparseそのためにモジュールを使用できます:

>>> open('args.txt', 'w').write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')

stdlib に含まれている可能性があります。 pep 389を参照してください。

于 2009-12-10T21:00:38.393 に答える
4

私も同様の問題を抱えていましたが、設定ファイルを引数として指定したかったのです。S. Lott の回答に触発されて、次のコードを思いつきました。

端末セッションの例:

$ python defaultconf.py # ハードコーディングされたデフォルトを使用
間違い
$ python defaultconf.py --verbose # コマンドラインで冗長
真実
$ python defaultconf.py --loadconfig blah # 'verbose':True で設定をロード
真実
$ python defaultconf.py --loadconfig blah --quiet # 設定値をオーバーライド
間違い

コード:

#!/usr/bin/env python2.6
import optparse

def getParser(defaults):
    """Create and return an OptionParser instance, with supplied defaults
    """
    o = optparse.OptionParser()
    o.set_defaults(**defaults)
    o.add_option("--verbose", dest = "verbose", action="store_true")
    o.add_option("--quiet", dest = "verbose", action="store_false")

    o.add_option("--loadconfig", dest = "loadconfig")

    return o


def main():
    # Hard coded defaults (including non-command-line-argument options)
    my_defaults = {'verbose': False, 'config_only_variable': 42}

    # Initially parse arguments
    opts, args = getParser(my_defaults).parse_args()

    if opts.loadconfig is not None:
        # Load config from disk, update the defaults dictionary, and reparse
        # Could use ConfigParser, simplejson, yaml etc.

        config_file_values = {'verbose': True} # the dict loaded from disk

        my_defaults.update(config_file_values)
        opts, args = getParser(my_defaults).parse_args()

    print opts.verbose

if __name__ == '__main__':
    main()

実用的な実装は Github にあります: The defaults dictionarythe argument parser and the main function

于 2010-02-05T22:59:12.913 に答える
3

そのためのset_defaults関数です。 http://docs.python.org/library/optparse.html#optparse.OptionParser.set_defaults

デフォルト値のディクショナリであるファイルを作成します。

{ 'arg1': 'this',
'arg2': 'that'
}

次に、このファイルを読み取り、それを評価してテキストを辞書に変換し、この辞書を引数として に提供しますset_defaults

本当に心配な場合はeval、このファイルに JSON (または YAML) 表記を使用してください。または、それからファイルを作成して、デフォルトを取得するために.INI使用することもできます。configparser

または、代入ステートメントと の単純なリストを使用できますexec

構成ファイル。

arg1 = 'this'
arg2 = 'that'

設定ファイルの読み取り。

defaults= {}
with open('defaults.py','r') as config
    exec config in {}, defaults
于 2009-12-10T11:40:56.217 に答える
0

最近、フラグとオプションを使用して多くのスクリプトを作成し、ここで説明するソリューションを思いつきました。

基本的に、ファイルからオプションを試してロードするように指示する特別なフラグを持つ optionparser をインスタンス化するので、コマンド ラインからオプションを指定する通常のスクリプトを使用したり、ファイルからそれら (またはそれらのセット) を提供したりできます。

更新: GitHubでコードを共有しました

于 2011-10-13T14:06:45.353 に答える