один конфигурационный файл Python - PullRequest
22 голосов
/ 27 февраля 2010

Я разрабатываю проект, для которого требуется один файл конфигурации, данные которого используются несколькими модулями.
Мой вопрос: каков общий подход к этому? я должен прочитать файл конфигурации от каждого из моих модулей (файлов) или есть другой способ сделать это?

Я думал о модуле config.py, который читает файлы конфигурации, и всякий раз, когда мне нужна конфигурация, я делаю import config, а затем что-то вроде config.data['teamsdir'] получаем свойство 'teamsdir' (например).

response : тогда выбрали подход conf.py, поскольку он модульный, гибкий и простой

Я могу просто поместить данные конфигурации прямо в файл, причем, если я хочу прочитать из json-файла XML-файл или несколько источников, я просто изменяю conf.py и проверяю, чтобы к данным обращались одинаково.

принятый ответ : выбрал ответ "Alex Martelli", потому что он был наиболее полным. проголосовали за другие ответы, потому что они тоже хорошие и полезные.

Ответы [ 4 ]

10 голосов
/ 28 февраля 2010

Мне нравится подход одиночного config.py модуля, тело которого (при первом импортировании) анализирует один или несколько файлов данных конфигурации и соответственно устанавливает свои собственные "глобальные переменные" - хотя я бы предпочел config.teamdata над круговой config.data['teamdata'] подход.

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

«Один или несколько» файлов конфигурации (например, сначала где-то в /etc для общих настроек по умолчанию, затем один в /usr/local для их переопределений для конкретного сайта, затем снова, возможно, один в домашнем каталоге пользователя для пользовательских настроек ) является распространенным и полезным шаблоном.

4 голосов
/ 27 февраля 2010

Подход, который вы описываете, в порядке. Если вы хотите добавить поддержку пользовательских конфигурационных файлов, вы можете использовать execfile(os.path.expanduser("~/.yourprogram/config.py")).

3 голосов
/ 28 февраля 2010

Один хороший подход - проанализировать конфигурационные файлы в объекте Python при запуске приложения и передать этот объект всем классам и модулям, которым необходим доступ к конфигурации.

Это может сэкономить много времени при разборе конфигурации.

1 голос
/ 28 февраля 2010

Если вы хотите поделиться своей конфигурацией на разных машинах, вы можете разместить ее на веб-сервере и выполнить импорт следующим образом:

import urllib2
confstr = urllib2.urlopen("http://yourhost/config.py").read()
exec(confstr)

И если вы хотите поделиться им на разных языках, возможно, вы можете использовать JSON для кодирования и анализа конфигурации:

import urllib2
import simplejson
confstr = urllib2.urlopen("http://yourhost/config.py").read()
config = simplejson.loads(confstr)
...