Packaging Python applications with configuration files
configuration-files, packaging, python
Solution
you can use `data_files` option of `distutils` to install files wherever you want.
`data_files` specifies a sequence of `(directory, files)` pairs in the following way:
setup(...,
data_files=[('/etc', ['cfg/config1.ini', 'cfg/config2.ini']),
('/etc/init.d', ['bin/initscript1'])],
....
)
When reading the config file on your app, you can merge a `/home` version if it exists, using `.read()` method of `ConfigParser` objects:
files_read = cfgparserobj.read(['/etc/config1.ini',
os.path.expanduser('~/.config1.ini')])
for fname in files_read:
print "Reading config from", fname
That will read `/etc/config1.ini` and then overwrite the definitions with stuff coming from `.config1.ini` in the user's home directory, if it exists.
Problem
I'm using ConfigParser for configuring my application, and now I want to make it easily distributable, and at the same time preserve the configurability. I'm thinking I need a directory with configuration file templates, and some way of generating the configuration to actually use from these. Then I need a place to store it that will work in virtualenv, the users home directory etc. I want it to be as close to how normal Unix packages work, i.e. have config in etc, but with overrides in home directory. Is there a readymade solution for this, and if not, what should I put in my setup.py etc to make it work like I want?