Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Packaging Python applications with configuration files

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?

like image 759
Joakim Lundborg Avatar asked Jan 08 '10 10:01

Joakim Lundborg


People also ask

How are Python applications packaged?

Python's native packaging is mostly built for distributing reusable code, called libraries, between developers. You can piggyback tools, or basic applications for developers, on top of Python's library packaging, using technologies like setuptools entry_points. Libraries are building blocks, not complete applications.

HOW include config file in Python?

Python can have config files with all settings needed by the application dynamically or periodically. Python config files have the extension as . ini. We'll use VS Code (Visual Studio Code) to create a main method that uses config file to read the configurations and then print on the console.


1 Answers

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.

like image 179
nosklo Avatar answered Sep 22 '22 19:09

nosklo