Where to put a configuration file in Python?

Sandro Munda picture Sandro Munda · Sep 27, 2011 · Viewed 45.6k times · Source

In development mode, I have the following directory tree :

| my_project/
| setup.py
| my_project/
    | __init__.py
    | main.py
    | conf/
        | myproject.conf

I use ConfigParser to parse the myproject.conf file.

In my code, it's easy to load the file with a good path : my_project/conf/myproject.conf

The problem is : When I install my project using the setup.py, the configuration file are situated (thanks to setup.py) in the /etc/my_project/myproject.conf and my application in the /usr/lib/python<version>/site-packages/my_project/.

How can I refer my my_project/conf/myproject.conf file in my project in "production" mode, and refer to the local file (my_project/conf/myproject.conf) in "devel" mode.

In addition, I would like to be portable if possible (Work on windows for example).

What's the good practice to do that ?

Answer

S.Lott picture S.Lott · Sep 27, 2011

Have you seen how configuration files work? Read up on "rc" files, as they're sometimes called. "bashrc", "vimrc", etc.

There's usually a multi-step search for the configuration file.

  1. Local directory. ./myproject.conf.

  2. User's home directory (~user/myproject.conf)

  3. A standard system-wide directory (/etc/myproject/myproject.conf)

  4. A place named by an environment variable (MYPROJECT_CONF)

The Python installation would be the last place to look.

config= None
for loc in os.curdir, os.path.expanduser("~"), "/etc/myproject", os.environ.get("MYPROJECT_CONF"):
    try: 
        with open(os.path.join(loc,"myproject.conf")) as source:
            config.readfp( source )
    except IOError:
        pass