私はしばらくの間 optparse を使用しており、構成ファイルから引数をロードする機能を追加したいと考えています。
これまでのところ、私が考えることができる最高のものは、引数がハードコードされたラッパーバッチスクリプトです...不格好に思えます。
これを行う最もエレガントな方法は何ですか?
構成ファイルを使用するという 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
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を参照してください。
私も同様の問題を抱えていましたが、設定ファイルを引数として指定したかったのです。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 dictionary、the argument parser and the main function
そのための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
最近、フラグとオプションを使用して多くのスクリプトを作成し、ここで説明するソリューションを思いつきました。
基本的に、ファイルからオプションを試してロードするように指示する特別なフラグを持つ optionparser をインスタンス化するので、コマンド ラインからオプションを指定する通常のスクリプトを使用したり、ファイルからそれら (またはそれらのセット) を提供したりできます。
更新: GitHubでコードを共有しました