我有一个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"
如果命令行中缺少任何参数,则默认值为输入。
答案 0 :(得分:1)
您可以使用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)
答案 1 :(得分:0)
我建议调查像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
这将加载所有默认选项。放在命令行上的任何选项都将覆盖或添加到选项dict。
答案 2 :(得分:0)
首先,我将代码移到主部分,这样您就可以在不执行代码的情况下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']
其次,我使用STB land建议使用argparse解析命令行,如:
def main():
# do the parsing thing first, then:
filename = args.filename
do_stuff(filename)
通过这种方式,您可以巧妙地使用python自己的unit test framework或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 ....
这带来了额外的好处,即没有全局变量,这会使你的生活变得复杂。