On Wed, Feb 18, 2009 at 7:30 AM, Wayne Watson
<[email protected]>wrote:
> See Subject. I've run across a 58 page document
> <http://www.voidspace.org.uk/python/configobj.html><http://www.voidspace.org.uk/python/configobj.html>,
> but am uncertain of its applicability to my present needs (see my thread on
> "Changing the Attribute"). Usually, I end up with some 3-4 page document, so
> this raises an eyebrow. Am I on the right trail? In the meantime, I think
> I'll turn it into a more manageable pdf file before putting it to paper.
>
It's a very powerful module - does lots of things you don't need yet, and
maybe never will - and I agree that it could benefit from a
hit-the-ground-running guide...
Here's a quick-and-dirty; you can flesh out the details from the
documentation you downloaded. (By the way, you'll also want to use the
validate module - another 14 pages or so...)
======================================================
* Download configobj.py and validate.py; put them somewhere in your
Python path (or in the same folder as your project, if you want)
* Add two lines to the top of your program:
from configobj import ConfigObj
from validate import Validator
* To make working with your spec easier,
import StringIO # allows you to work with strings as if they were
files
# You could just create a spec file, and open it normally, but this
keeps everything in one place.
* Somewhere in your program, create your spec and load it. There are a
lot of ways you can do this - for me, the simple thing is to put it in a
class. I create a class called Global - it's a crutch, I know...
class Global(object):
cfgFileName = os.getcwd() + os.sep + 'Initial.sen' # current
directory + "\" + filename - but you could put it anywhere and call it
anything
# create your spec as a multi-line string between triple quotes
tmpStr = """
mask_file_name = string(default=None)
gray_scale = boolean(default=True)
post_event_stack = boolean(default=False)
post_event_format = string(default="Tiff 2")
show_real_time = boolean(default=False)
hourly_rate = integer(min=0, default=0)
slowdown= integer(min=0, max=10, default=1) # I don't know what
this value is/does, so this is probably wrong
start_time = string(default="00:00:00") # or you could make the
default None?
stop_time = string(default="00:00:00")
lat = float(min=0.0, max=90.0) # I have no idea what you'd want
as a default latitude, if any...
"""
cfgSpec = StringIO.StringIO(tmpStr) # turns the above string
into a file-like object, which ConfigObj is expecting
cfgFile = ConfigObj(cfgFileName,
configspec=cfgSpec, raise_errors=True,
write_empty_values=True,
create_empty=True, indent_type=' ',
list_values=True) # creates the actual ConfigObj object
vtor = Validator() # creates a validator to match your config
data against your spec
* Invoke the above code when your program starts - I do it just before
my mainloop, like so:
def main(argv=None):
if argv is None:
argv = sys.argv
test = Global.cfgFile.validate(Global.vtor, copy=True) # tries
to load cfgFile; if it doesn't exist, creates it; fills in defaults for any
missing values
Global.cfgFile.write() # saves the validated file (you don't
need to do this here at the start, but I usually do)
app = MyApp(0)
app.MainLoop()
if __name__ == '__main__':
main()
* Your ConfigObj is ready to use! Simply access the contents like a
regular dictionary. To save back to the file, call the write() method.
Global.cfgFile['mask_file_name'] = 'bogus.txt'
Global.cfgFile.write()
maskFile = Global.cfgFile['mask_file_name']
* Or use the values directly without copying to intermediate variables:
with open(Global.cfgFile['mask_file_name'], 'w+b') as maskFile:
maskFile.write('some bogus text')
======================================================
I'm attaching that as a text file too - I suspect that my indentation won't
survive the trip...
My Global class is an ugly hack. I'm sure you'll come up with something
more aesthetically pleasing...
ConfigObj has lots of very cool features - sections, repeated sections,
custom input validators - that's what the 50+ pages of documentation are
about. When you need that stuff, it's available.
--
www.fsrtechnologies.com
* Download configobj.py and validate.py; put them somewhere in your Python
path (or in the same folder as your project, if you want)
* Add two lines to the top of your program:
from configobj import ConfigObj
from validate import Validator
* To make working with your spec easier,
import StringIO # allows you to work with strings as if they were files
# You could just create a spec file, and open it normally, but this
keeps everything in one place.
* Somewhere in your program, create your spec and load it. There are a lot
of ways you can do this - for me, the simple thing is to put it in a class. I
create a class called Global - it's a crutch, I know...
class Global(object):
cfgFileName = os.getcwd() + os.sep + 'Initial.sen' # current
directory + "\" + filename - but you could put it anywhere and call it anything
# create your spec as a multi-line string between triple quotes
tmpStr = """
mask_file_name = string(default=None)
gray_scale = boolean(default=True)
post_event_stack = boolean(default=False)
post_event_format = string(default="Tiff 2")
show_real_time = boolean(default=False)
hourly_rate = integer(min=0, default=0)
slowdown= integer(min=0, max=10, default=1) # I don't know what
this value is/does, so this is probably wrong
start_time = string(default="00:00:00") # or you could make the
default None?
stop_time = string(default="00:00:00")
lat = float(min=0.0, max=90.0) # I have no idea what you'd want as
a default latitude, if any...
"""
cfgSpec = StringIO.StringIO(tmpStr) # turns the above string into a
file-like object, which ConfigObj is expecting
cfgFile = ConfigObj(cfgFileName,
configspec=cfgSpec, raise_errors=True,
write_empty_values=True,
create_empty=True, indent_type=' ',
list_values=True) # creates the actual ConfigObj object
vtor = Validator() # creates a validator to match your config data
against your spec
* Invoke the above code when your program starts - I do it just before my
mainloop, like so:
def main(argv=None):
if argv is None:
argv = sys.argv
test = Global.cfgFile.validate(Global.vtor, copy=True) # tries to
load cfgFile; if it doesn't exist, creates it; fills in defaults for any
missing values
Global.cfgFile.write() # saves the validated file (you don't need
to do this here at the start, but I usually do)
app = MyApp(0)
app.MainLoop()
if __name__ == '__main__':
main()
* Your ConfigObj is ready to use! Simply access the contents like a
regular dictionary. To save back to the file, call the write() method.
Global.cfgFile['mask_file_name'] = 'bogus.txt'
Global.cfgFile.write()
maskFile = Global.cfgFile['mask_file_name']
* Or use the values directly without copying to intermediate variables:
with open(Global.cfgFile['mask_file_name'], 'w+b') as maskFile:
maskFile.write('some bogus text')
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor