1 """Configuration file parser.
3 A setup file consists of sections, lead by a "[section]" header,
4 and followed by "name: value" entries, with continuations and such in
7 The option values can contain format strings which refer to other values in
8 the same section, or values in a special [DEFAULT] section.
12 something: %(dir)s/whatever
14 would resolve the "%(dir)s" to the value of dir. All reference
15 expansions are done late, on demand.
17 Intrinsic defaults can be specified by passing them into the
18 ConfigParser constructor as a dictionary.
22 ConfigParser -- responsible for for parsing a list of
23 configuration files, and managing the parsed database.
27 __init__(defaults=None)
28 create the parser and specify a dictionary of intrinsic defaults. The
29 keys must be strings, the values must be appropriate for %()s string
30 interpolation. Note that `__name__' is always an intrinsic default;
31 it's value is the section's name.
34 return all the configuration section names, sans DEFAULT
37 return whether the given section exists
39 has_option(section, option)
40 return whether the given option exists in the given section
43 return list of configuration options for the named section
45 has_option(section, option)
46 return whether the given section has the given option
49 read and parse the list of named configuration files, given by
50 name. A single filename is also allowed. Non-existing files
53 readfp(fp, filename=None)
54 read and parse one configuration file, given as a file object.
55 The filename defaults to fp.name; it is only used in error
56 messages (if fp has no `name' attribute, the string `<???>' is used).
58 get(section, option, raw=0, vars=None)
59 return a string value for the named option. All % interpolations are
60 expanded in the return values, based on the defaults passed into the
61 constructor and the DEFAULT section. Additional substitutions may be
62 provided using the `vars' argument, which must be a dictionary whose
63 contents override any pre-existing defaults.
65 getint(section, options)
66 like get(), but convert value to an integer
68 getfloat(section, options)
69 like get(), but convert value to a float
71 getboolean(section, options)
72 like get(), but convert value to a boolean (currently defined as 0 or
75 remove_section(section)
76 remove the given file section and all its options
78 remove_option(section, option)
79 remove the given option from the given section
81 set(section, option, value)
85 write the configuration state in .ini format
92 __all__
= ["NoSectionError","DuplicateSectionError","NoOptionError",
93 "InterpolationError","InterpolationDepthError","ParsingError",
94 "MissingSectionHeaderError","ConfigParser",
95 "MAX_INTERPOLATION_DEPTH"]
97 DEFAULTSECT
= "DEFAULT"
99 MAX_INTERPOLATION_DEPTH
= 10
104 class Error(Exception):
105 def __init__(self
, msg
=''):
107 Exception.__init
__(self
, msg
)
112 class NoSectionError(Error
):
113 def __init__(self
, section
):
114 Error
.__init
__(self
, 'No section: %s' % section
)
115 self
.section
= section
117 class DuplicateSectionError(Error
):
118 def __init__(self
, section
):
119 Error
.__init
__(self
, "Section %s already exists" % section
)
120 self
.section
= section
122 class NoOptionError(Error
):
123 def __init__(self
, option
, section
):
124 Error
.__init
__(self
, "No option `%s' in section: %s" %
127 self
.section
= section
129 class InterpolationError(Error
):
130 def __init__(self
, reference
, option
, section
, rawval
):
132 "Bad value substitution:\n"
137 % (section
, option
, reference
, rawval
))
138 self
.reference
= reference
140 self
.section
= section
142 class InterpolationDepthError(Error
):
143 def __init__(self
, option
, section
, rawval
):
145 "Value interpolation too deeply recursive:\n"
149 % (section
, option
, rawval
))
151 self
.section
= section
153 class ParsingError(Error
):
154 def __init__(self
, filename
):
155 Error
.__init
__(self
, 'File contains parsing errors: %s' % filename
)
156 self
.filename
= filename
159 def append(self
, lineno
, line
):
160 self
.errors
.append((lineno
, line
))
161 self
._msg
= self
._msg
+ '\n\t[line %2d]: %s' % (lineno
, line
)
163 class MissingSectionHeaderError(ParsingError
):
164 def __init__(self
, filename
, lineno
, line
):
167 'File contains no section headers.\nfile: %s, line: %d\n%s' %
168 (filename
, lineno
, line
))
169 self
.filename
= filename
176 def __init__(self
, defaults
=None):
181 self
.__defaults
= defaults
184 return self
.__defaults
187 """Return a list of section names, excluding [DEFAULT]"""
188 # self.__sections will never have [DEFAULT] in it
189 return self
.__sections
.keys()
191 def add_section(self
, section
):
192 """Create a new section in the configuration.
194 Raise DuplicateSectionError if a section by the specified name
197 if self
.__sections
.has_key(section
):
198 raise DuplicateSectionError(section
)
199 self
.__sections
[section
] = {}
201 def has_section(self
, section
):
202 """Indicate whether the named section is present in the configuration.
204 The DEFAULT section is not acknowledged.
206 return section
in self
.sections()
208 def options(self
, section
):
209 """Return a list of option names for the given section name."""
211 opts
= self
.__sections
[section
].copy()
213 raise NoSectionError(section
)
214 opts
.update(self
.__defaults
)
215 if opts
.has_key('__name__'):
219 def has_option(self
, section
, option
):
220 """Return whether the given section has the given option."""
221 return option
in self
.options(section
)
223 def read(self
, filenames
):
224 """Read and parse a filename or a list of filenames.
226 Files that cannot be opened are silently ignored; this is
227 designed so that you can specify a list of potential
228 configuration file locations (e.g. current directory, user's
229 home directory, systemwide directory), and all existing
230 configuration files in the list will be read. A single
231 filename may also be given.
233 if type(filenames
) in [type(''), type(u
'')]:
234 filenames
= [filenames
]
235 for filename
in filenames
:
240 self
.__read
(fp
, filename
)
243 def readfp(self
, fp
, filename
=None):
244 """Like read() but the argument must be a file-like object.
246 The `fp' argument must have a `readline' method. Optional
247 second argument is the `filename', which if not given, is
248 taken from fp.name. If fp has no `name' attribute, `<???>' is
255 except AttributeError:
257 self
.__read
(fp
, filename
)
259 def get(self
, section
, option
, raw
=0, vars=None):
260 """Get an option value for a given section.
262 All % interpolations are expanded in the return values, based on the
263 defaults passed into the constructor, unless the optional argument
264 `raw' is true. Additional substitutions may be provided using the
265 `vars' argument, which must be a dictionary whose contents overrides
266 any pre-existing defaults.
268 The section DEFAULT is special.
271 sectdict
= self
.__sections
[section
].copy()
273 if section
== DEFAULTSECT
:
276 raise NoSectionError(section
)
277 d
= self
.__defaults
.copy()
279 # Update with the entry specific variables
282 option
= self
.optionxform(option
)
286 raise NoOptionError(option
, section
)
291 # do the string interpolation
292 value
= rawval
# Make it a pretty variable name
294 while depth
< 10: # Loop through this until it's done
296 if value
.find("%(") >= 0:
299 except KeyError, key
:
300 raise InterpolationError(key
, option
, section
, rawval
)
303 if value
.find("%(") >= 0:
304 raise InterpolationDepthError(option
, section
, rawval
)
307 def __get(self
, section
, conv
, option
):
308 return conv(self
.get(section
, option
))
310 def getint(self
, section
, option
):
311 return self
.__get
(section
, string
.atoi
, option
)
313 def getfloat(self
, section
, option
):
314 return self
.__get
(section
, string
.atof
, option
)
316 def getboolean(self
, section
, option
):
317 v
= self
.get(section
, option
)
319 if val
not in (0, 1):
320 raise ValueError, 'Not a boolean: %s' % v
323 def optionxform(self
, optionstr
):
324 return optionstr
.lower()
326 def has_option(self
, section
, option
):
327 """Check for the existence of a given option in a given section."""
328 if not section
or section
== "DEFAULT":
329 return self
.__defaults
.has_key(option
)
330 elif not self
.has_section(section
):
333 option
= self
.optionxform(option
)
334 return self
.__sections
[section
].has_key(option
)
336 def set(self
, section
, option
, value
):
338 if not section
or section
== "DEFAULT":
339 sectdict
= self
.__defaults
342 sectdict
= self
.__sections
[section
]
344 raise NoSectionError(section
)
345 option
= self
.optionxform(option
)
346 sectdict
[option
] = value
349 """Write an .ini-format representation of the configuration state."""
351 fp
.write("[DEFAULT]\n")
352 for (key
, value
) in self
.__defaults
.items():
353 fp
.write("%s = %s\n" % (key
, value
))
355 for section
in self
.sections():
356 fp
.write("[" + section
+ "]\n")
357 sectdict
= self
.__sections
[section
]
358 for (key
, value
) in sectdict
.items():
359 if key
== "__name__":
361 fp
.write("%s = %s\n" % (key
, value
))
364 def remove_option(self
, section
, option
):
365 """Remove an option."""
366 if not section
or section
== "DEFAULT":
367 sectdict
= self
.__defaults
370 sectdict
= self
.__sections
[section
]
372 raise NoSectionError(section
)
373 option
= self
.optionxform(option
)
374 existed
= sectdict
.has_key(option
)
379 def remove_section(self
, section
):
380 """Remove a file section."""
381 if self
.__sections
.has_key(section
):
382 del self
.__sections
[section
]
388 # Regular expressions for parsing section headers and options. Note a
389 # slight semantic change from the previous version, because of the use
390 # of \w, _ is allowed in section header names.
391 SECTCRE
= re
.compile(
393 r
'(?P<header>[^]]+)' # very permissive!
397 r
'(?P<option>[]\-[\w_.*,(){}]+)' # a lot of stuff found by IvL
398 r
'[ \t]*(?P<vi>[:=])[ \t]*' # any number of space/tab,
399 # followed by separator
400 # (either : or =), followed
402 r
'(?P<value>.*)$' # everything up to eol
405 def __read(self
, fp
, fpname
):
406 """Parse a sectioned setup file.
408 The sections in setup file contains a title line at the top,
409 indicated by a name in square brackets (`[]'), plus key/value
410 options lines, indicated by `name: value' format lines.
411 Continuation are represented by an embedded newline then
412 leading whitespace. Blank lines, lines beginning with a '#',
413 and just about everything else is ignored.
415 cursect
= None # None, or a dictionary
418 e
= None # None, or an exception
424 # comment or blank line?
425 if line
.strip() == '' or line
[0] in '#;':
427 if line
.split()[0].lower() == 'rem' \
428 and line
[0] in "rR": # no leading whitespace
431 if line
[0] in ' \t' and cursect
is not None and optname
:
434 cursect
[optname
] = cursect
[optname
] + '\n ' + value
435 # a section header or option header?
437 # is it a section header?
438 mo
= self
.SECTCRE
.match(line
)
440 sectname
= mo
.group('header')
441 if self
.__sections
.has_key(sectname
):
442 cursect
= self
.__sections
[sectname
]
443 elif sectname
== DEFAULTSECT
:
444 cursect
= self
.__defaults
446 cursect
= {'__name__': sectname
}
447 self
.__sections
[sectname
] = cursect
448 # So sections can't start with a continuation line
450 # no section header in the file?
451 elif cursect
is None:
452 raise MissingSectionHeaderError(fpname
, lineno
, `line`
)
455 mo
= self
.OPTCRE
.match(line
)
457 optname
, vi
, optval
= mo
.group('option', 'vi', 'value')
458 if vi
in ('=', ':') and ';' in optval
:
459 # ';' is a comment delimiter only if it follows
460 # a spacing character
461 pos
= optval
.find(';')
462 if pos
and optval
[pos
-1] in string
.whitespace
:
463 optval
= optval
[:pos
]
464 optval
= optval
.strip()
468 cursect
[self
.optionxform(optname
)] = optval
470 # a non-fatal parsing error occurred. set up the
471 # exception but keep going. the exception will be
472 # raised at the end of the file and will contain a
473 # list of all bogus lines
475 e
= ParsingError(fpname
)
476 e
.append(lineno
, `line`
)
477 # if any parsing errors occurred, raise an exception