Где поместить файл конфигурации в Python?

в режиме разработки у меня есть следующее дерево каталогов:

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

Я использую ConfigParser для разбора .

в моем коде легко загрузить файл с хорошим путем:my_project/conf/myproject.conf

проблема: когда я устанавливаю свой проект, используя setup.py, файл конфигурации находится (благодаря setup.py) в /etc/my_project/myproject.conf и мое заявление в /usr/lib/python<version>/site-packages/my_project/.

как я могу сослаться на мой в моем проект в режиме "производство" и обратитесь к локальному файлу (my_project/conf/myproject.conf) в режиме" devel".

кроме того, я хотел бы быть портативным, если это возможно (например, работа с windows).

какая хорошая практика для этого ?

5 ответов


вы видели, как работают файлы конфигурации? Читайте файлы" rc", как их иногда называют. "bashrc"," vimrc " и др.

обычно существует многоступенчатый поиск файла конфигурации.

  1. локальный каталог. ./myproject.conf.

  2. домашний каталог пользователя (~user/myproject.conf)

  3. стандартный системный каталог (/etc/myproject/myproject.conf)

  4. место, названное переменной среды (MYPROJECT_CONF)

установка Python будет последним местом для поиска.

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

Если вы используете setuptools, см. главу на использование файлов данных без пакетов. Не пытайтесь искать файлы самостоятельно.


на appdirs пакет делает хорошую работу по поиску стандартного места для установленных приложений на различных платформах. Интересно, имеет ли смысл расширять его, чтобы обнаружить или разрешить какой-то "удаленный" статус для разработчиков.


другой вариант-Сохранить все .cfg и .ini файлы в домашнем каталоге, например, "boto".

import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')

Я не думаю, что там чистый способ справиться с этим. Вы можете просто проверить наличие "локального" файла, который будет работать в режиме dev. В противном случае вернитесь к производственному пути:

main_base = os.path.dirname(__file__)
config_file = os.path.join([main_base, "conf", "myproject.conf"])

if not os.path.exists(config_file):
    config_file = PROD_CONFIG_FILE   # this could also be different based on the OS