pythonpythonpathconfigparser

Where to put a configuration file in Python?


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 ?


Solution

  • 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