Где поместить файл конфигурации в Python? - PullRequest
53 голосов
/ 27 сентября 2011

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

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

Я использую ConfigParser для анализа файла myproject.conf.

В моем коде легко загрузить файл с хорошим путем: 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 в моем проекте в «производственном» режиме и ссылаться на локальный файл (my_project/conf/myproject.conf) в режиме «devel».

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

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

Ответы [ 5 ]

36 голосов
/ 27 сентября 2011

Вы видели, как работают файлы конфигурации?Читайте о файлах "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
15 голосов
/ 06 октября 2012

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

14 голосов
/ 27 сентября 2011

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

2 голосов
/ 09 июля 2015

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

import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')
1 голос
/ 27 сентября 2011

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

import os.path

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
...