如何使用 python 创建动态配置文件
how to create dynamic configuration file using python
我有一个 python 脚本,它由一个名为 system.config 的配置文件控制。配置文件的结构如下所示,带有一些默认值.
[company]
companyname: XYZ
[profile]
name: ABC
joining: 1/1/2014
配置文件的代码是:config_parser_details.py
import ConfigParser
import sys
Config = ConfigParser.ConfigParser()
Config.read("system.config")
filename = "system.config"
def ConfigSectionMap(section):
dict1 = {}
options = Config.options(section)
for option in options:
try:
dict1[option] = Config.get(section, option)
if dict1[option] == -1:
DebugPrint("skip: %s" % option)
except:
print("exception on %s!" % option)
dict1[option] = None
return dict1
company = ConfigSectionMap("company")['companyname']
name = ConfigSectionMap("profile")['name']
joindate = ConfigSectionMap("profile")['joining']
现在我的脚本代码是:test.py
import config_parser_details as p
import sys
import warnings
import os
company = p.company
name = p.name
date = p.joindate
print("%s\n" %company)
print("%s\n" %name)
输出为
XYZ
ABC
现在我想通过命令行在配置文件中输入。
喜欢
python test.py --compname ="testing"
如果命令行中缺少任何参数,则将输入默认值。
我建议研究像 docopt 这样的工具。
不过,为了快速修复,您可以尝试这样做
def ConfigSectionMap(section):
options = Config.options(section)
arg_dict = {}
for command_line_argument in sys.argv[1:]:
arg = command_line_argument.split("=")
arg_dict[arg[0][2:]] = arg[1]
for key in arg_dict:
options[key] = arg_dict[key]
return options
这将加载所有默认选项。放在命令行上的任何选项都将覆盖或添加到选项字典中。
您可以使用 argparse 库来解析命令行参数。
因此您的 test.py 文件如下所示:
import config_parser_details as p
import sys
import warnings
import os
import argparse
commandLineArgumentParser = argparse.ArgumentParser()
commandLineArgumentParser.add_argument("-c", "--compname", help="Company name", default=p.company)
commandLineArguments = commandLineArgumentParser.parse_args()
company = commandLineArguments.compname
name = p.name
date = p.joindate
print("%s\n" %company)
print("%s\n" %name)
首先,我会将代码移动到 main 部分,这样您就可以 import config_parser_details
而无需执行代码:
if __name__ == '__main__':
main()
def main():
Config = ConfigParser.ConfigParser()
Config.read("system.config")
filename = "system.config"
company = ConfigSectionMap("company")['companyname']
name = ConfigSectionMap("profile")['name']
joindate = ConfigSectionMap("profile")['joining']
其次,我会使用 的建议,使用 argparse 解析命令行,例如:
def main():
# do the parsing thing first, then:
filename = args.filename
do_stuff(filename)
这样你就可以巧妙地使用python自己的 or nosetests编写测试文件,不需要你手动指定参数:
def test_basic():
# create a temporary file with tempfile.NamedTemporaryFile
tmpfile = tempfile.NamedTemporaryFile()
# add test data to tmpfile
do_stuff(tmpfile)
# check the output
assert ....
这带来了没有全局变量的额外好处,这会使您以后的生活变得复杂。
我有一个 python 脚本,它由一个名为 system.config 的配置文件控制。配置文件的结构如下所示,带有一些默认值.
[company]
companyname: XYZ
[profile]
name: ABC
joining: 1/1/2014
配置文件的代码是:config_parser_details.py
import ConfigParser
import sys
Config = ConfigParser.ConfigParser()
Config.read("system.config")
filename = "system.config"
def ConfigSectionMap(section):
dict1 = {}
options = Config.options(section)
for option in options:
try:
dict1[option] = Config.get(section, option)
if dict1[option] == -1:
DebugPrint("skip: %s" % option)
except:
print("exception on %s!" % option)
dict1[option] = None
return dict1
company = ConfigSectionMap("company")['companyname']
name = ConfigSectionMap("profile")['name']
joindate = ConfigSectionMap("profile")['joining']
现在我的脚本代码是:test.py
import config_parser_details as p
import sys
import warnings
import os
company = p.company
name = p.name
date = p.joindate
print("%s\n" %company)
print("%s\n" %name)
输出为
XYZ
ABC
现在我想通过命令行在配置文件中输入。 喜欢
python test.py --compname ="testing"
如果命令行中缺少任何参数,则将输入默认值。
我建议研究像 docopt 这样的工具。
不过,为了快速修复,您可以尝试这样做
def ConfigSectionMap(section):
options = Config.options(section)
arg_dict = {}
for command_line_argument in sys.argv[1:]:
arg = command_line_argument.split("=")
arg_dict[arg[0][2:]] = arg[1]
for key in arg_dict:
options[key] = arg_dict[key]
return options
这将加载所有默认选项。放在命令行上的任何选项都将覆盖或添加到选项字典中。
您可以使用 argparse 库来解析命令行参数。
因此您的 test.py 文件如下所示:
import config_parser_details as p
import sys
import warnings
import os
import argparse
commandLineArgumentParser = argparse.ArgumentParser()
commandLineArgumentParser.add_argument("-c", "--compname", help="Company name", default=p.company)
commandLineArguments = commandLineArgumentParser.parse_args()
company = commandLineArguments.compname
name = p.name
date = p.joindate
print("%s\n" %company)
print("%s\n" %name)
首先,我会将代码移动到 main 部分,这样您就可以 import config_parser_details
而无需执行代码:
if __name__ == '__main__':
main()
def main():
Config = ConfigParser.ConfigParser()
Config.read("system.config")
filename = "system.config"
company = ConfigSectionMap("company")['companyname']
name = ConfigSectionMap("profile")['name']
joindate = ConfigSectionMap("profile")['joining']
其次,我会使用
def main():
# do the parsing thing first, then:
filename = args.filename
do_stuff(filename)
这样你就可以巧妙地使用python自己的
def test_basic():
# create a temporary file with tempfile.NamedTemporaryFile
tmpfile = tempfile.NamedTemporaryFile()
# add test data to tmpfile
do_stuff(tmpfile)
# check the output
assert ....
这带来了没有全局变量的额外好处,这会使您以后的生活变得复杂。