我有一个配置文件(feedbar.cfg),其中包含以下内容:
[last_session]
last_position_x=10
last_position_y=10
运行以下python脚本之后:
#!/usr/bin/env python
import pygtk
import gtk
import ConfigParser
import os
pygtk.require('2.0')
class FeedbarConfig():
""" Configuration class for Feedbar.
Used to persist / read data from feedbar's cfg file """
def __init__(self, cfg_file_name="feedbar.cfg"):
self.cfg_file_name = cfg_file_name
self.cfg_parser = ConfigParser.ConfigParser()
self.cfg_parser.readfp(open(cfg_file_name))
def update_file(self):
with open(cfg_file_name,"wb") as cfg_file:
self.cfg_parser.write(cfg_file)
#PROPERTIES
def get_last_position_x(self):
return self.cfg_parser.getint("last_session", "last_position_x")
def set_last_position_x(self, new_x):
self.cfg_parser.set("last_session", "last_position_x", new_x)
self.update_file()
last_position_x = property(get_last_position_x, set_last_position_x)
if __name__ == "__main__":
#feedbar = FeedbarWindow()
#feedbar.main()
config = FeedbarConfig()
print config.last_position_x
config.last_position_x = 5
print config.last_position_x
输出结果为:
10
5
但文件未更新。 cfg文件内容保持不变。
有什么建议吗?
是否有另一种方法将配置信息从文件绑定到python类?像Java中的JAXB(但不是XML,只是.ini文件)。
谢谢!
答案 0 :(得分:3)
Edit2:你的代码无效的原因是因为FeedbarConfig
必须从object继承为新式类。属性不适用于经典类。:
所以解决方案是使用
class FeedbarConfig(object)
编辑:JAXB是否读取XML文件并将其转换为对象?如果是这样,您可能需要查看lxml.objectify。这将为您提供一种简单的方法来读取并将配置保存为XML。
Is there another way to bind config information from a file into a python class ?
是。您可以使用shelve,marshal或pickle来保存Python对象(例如列表或词典)。
上次我尝试使用ConfigParser时遇到了一些问题:
虽然这些不是您目前面临的问题,虽然保存文件可能很容易修复,但您可能需要考虑使用其他模块之一以避免将来出现问题。
答案 1 :(得分:2)
[我会把它放在评论中,但我现在不允许发表评论]
顺便说一下,你可能想要使用装饰风格的属性,它们让事情看起来更好,至少在我看来:
#PROPERTIES
@property
def position_x(self):
return self.cfg_parser.getint("last_session", "last_position_x")
@position_x.setter
def position_x(self, new_x):
self.cfg_parser.set("last_session", "last_position_x", new_x)
self.update_file()
另外,根据python文档,SafeConfigParser是获取新应用程序的方法:
“如果新应用程序不需要与旧版本的Python兼容,则应该更喜欢这个版本。” - http://docs.python.org/library/configparser.html