Мне настраивали регистратор Python, с помощью модуля входа Python. Я хочу сохранить строку, которую я использую с регистрирующимся объектом Средства форматирования в конфигурационном файле с помощью модуля ConfigParser.
Строка формата хранится в словаре настроек в отдельном файле, который обрабатывает чтение и запись файла конфигурации. Проблема, которую я имею, состоит в том, что Python все еще пытается отформатировать файл и падает, когда он читает весь logging-module-specific форматирующие флаги.
{
"log_level":logging.debug,
"log_name":"C:\\Temp\\logfile.log",
"format_string":
"%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
}
Мой вопрос прост: как я могу отключить функциональность форматирования здесь при хранении его в другом месте. Моя первоначальная реакция была обильным использованием обратной косой черты для выхода из различных символов процента, но это, конечно, постоянно повреждает форматирование, таким образом, что это работа привычки, даже когда мне нужен он к.
Я должен также упомянуть, так как это было скуплено в комментариях, что ConfigParser делает некоторую внутреннюю интерполяцию, которая вызывает прохождение. Вот мой traceback:
Traceback (most recent call last):
File "initialconfig.py", line 52, in <module>
"%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
File "initialconfig.py", line 31, in add_settings
self.set(section_name, setting_name, default_value)
File "C:\Python26\lib\ConfigParser.py", line 668, in set
"position %d" % (value, m.start()))
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module
)s, line %(lineno)d - %(message)s' at position 10
Кроме того, общие указатели на хороших методах файла настроек были бы хороши. Это - первый раз, когда я сделал что-либо значительное с ConfigParser (или регистрирующийся в этом отношении).
Заранее спасибо, Dominic
Вы можете использовать ConfigParser.RawConfigParser
вместо ConfigParser.ConfigParser
. Только последний выполняет волшебную интерполяцию значений конфигурации.
РЕДАКТИРОВАТЬ:
На самом деле, используя ConfigParser.SafeConfigParser
, вы сможете экранировать строки формата с дополнительным знаком процента %
. Этот пример должен работать тогда:
{
"log_level":logging.debug,
"log_name":"C:\\Temp\\logfile.log",
"format_string":
"%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s"
}
В чем проблема с приведенным выше кодом? Интерполяция выполняется только в том случае, если к строке применяется оператор %
. Если вы не используете %
, вы можете использовать строку форматирования как любую другую строку.
Есть RawConfigParser
, который похож на ConfigParser
без поведения интерполяции. Если вы не используете функцию интерполяции в какой-либо другой части файла конфигурации, вы можете просто заменить ConfigParser
на RawConfigParser
в своем коде.
Дополнительные сведения см. В документации RawConfigParser .
Какую версию Python вы используете? Обновление до 2.6.4 может помочь, см.