Яка найкраща практика використання файлу налаштувань у Python? [зачинено]


332

У мене є сценарій командного рядка, який я запускаю з великою кількістю аргументів. Зараз я дійшов до того, що в мене занадто багато аргументів, і я хочу мати деякі аргументи і у словниковій формі.

Отже, щоб спростити речі, я хотів би запустити скрипт із файлом налаштувань. Я не знаю, які бібліотеки слід використовувати для розбору файлу. Яка найкраща практика для цього? Я, звичайно, міг би щось забити сам, але якщо для цього є якась бібліотека, я все вухо.

Кілька «вимог»:

  • Замість використання pickleя хотів би, щоб це був текст прямого прямого тексту, який легко читати та редагувати.
  • Я хочу мати змогу додавати в нього дані, подібні до словника, тобто якась форма введення повинна підтримуватися.

Спрощений псевдо-приклад файлу:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2

6
Конкретний синтаксис цього прикладу - це фактично YAML, перевірте відповідь Бенсона.
— Skippy le Grand Gourou

Відповіді:


231

Ви можете мати звичайний модуль Python, скажімо config.py, таким чином:

truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

і використовувати його так:

import config
print config.truck['color']  

69
Це дуже погана ідея, як якщо ви хочете дозволити користувачам з низькими привілеями мати змогу змінювати лише конфігураційні файли, таким чином ви по суті дозволяєте їм проникнути у привілейований код.
— nikolay

172
Дозволити користувачам з низькими пільгами змінювати конфігурацію для більш привілейованої програми, мабуть, все-таки сумнівна настройка.
— XTL

18
Ви також можете зіткнутися з проблемами, які пакують ваш проект для розгортання за допомогою інструменту, такого як py2app. Користувач може не мати можливості редагувати файл конфігурації після його поширення, оскільки це призведе до недійсності підпису програми.
— bschwagg

18
Основним недоліком цього (в іншому випадку дуже зручного варіанту) є те, що .pyфайли виконуються, тому будь-який код можна запускати, намагаючись завантажити конфігурацію import. Це неприпустимо з точки зору безпеки.
— Апалала

5
Неможливо зробити безпечну версію цього ast.literal_eval? docs.python.org/3/library/ast.html#ast.literal_eval
— Андре К. Андерсен

169

Наведений вами зразок конфігурації є дійсно дійсним YAML . Насправді YAML відповідає всім вашим вимогам, реалізована у великій кількості мов і є надзвичайно доброзичливою для людини. Я б дуже рекомендував вам використовувати його. Проект PyYAML пропонує чудовий модуль python, який реалізує YAML.

Використовувати модуль yaml надзвичайно просто:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))

3
ямл - це завжди те, до чого я звертаюся; формат може бути від простого мертвого до підтримуваного вбудованого пітонного коду, а стандартна бібліотека робить для вас важкий підйом розбору та санітарії.
— Тодор Мінаков

15
Домовились. Для вас або користувачів, які пишуть YAML, ось найкраща посилання YAML, яку я знаю . На жаль, офіційна документація - це специфікація, спрямована на реалізаторів, і більше нічого, але керівництво Eevee - фантастичне.
— Esteis

5
Для нас непосвячених, pip3 install pyyamlце готується до імпорту в сценарії python.
— користувач8675309

2
Остерігайтеся, yaml є доброзичливим лише в тому випадку, якщо ви тримаєте його дуже просто, за замовчуванням він має безліч проблем, що межують з небезпечними особливостями. Спробуйте замість hitchdev.com/strictyaml як безпечну альтернативу Lite за замовчуванням.
— Грінго

107

Я знайшов це найкориснішим та найпростішим у використанні https://wiki.python.org/moin/ConfigParserExamples

Ви просто створите "myfile.ini" на зразок:

[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True

[SectionTwo]
FavoriteColor=Green
[SectionThree]
FamilyName: Johnson

[Others]
Route: 66

І отримайте такі дані, як:

>>> import ConfigParser
>>> Config = ConfigParser.ConfigParser()
>>> Config
<ConfigParser.ConfigParser instance at 0x00BA9B20>
>>> Config.read("myfile.ini")
['c:\\tomorrow.ini']
>>> Config.sections()
['Others', 'SectionThree', 'SectionOne', 'SectionTwo']
>>> Config.options('SectionOne')
['Status', 'Name', 'Value', 'Age', 'Single']
>>> Config.get('SectionOne', 'Status')
'Single'

20
Для Python 3 замість цього використовується модуль configparser (всі малі регістри)
— Roland

2
Це найшвидше, найяскравіше і найпростіше в застосуванні рішення, оскільки немає реалізації, а лише використання. :) Спасибі!
— Олександр

Невже ця підтримка вкладених словників, як задано у запитанні?
— Якуб Блаха

54

Yaml і Json - найпростіші та найчастіше використовувані формати файлів для зберігання налаштувань / конфігурацій. PyYaml можна використовувати для розбору ямлів. Json вже є частиною пітона з 2.5. Ямл - суперсеть Джсона. Json вирішить більшість випадків використання, за винятком багаторядкових рядків, де потрібне проходження. Ямл теж опікується цими справами.

>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))   
{u'handler': u'adminhandler.py', u'timeoutsec': 5}

13
Хоча більш-менш еквівалентний, json не настільки начитаний для людини, як ямл. Оскільки його конфігурація зразка насправді дійсна yaml, я наголошую, що замість json.
— Бенсон

23
Використання "json.dump (config, fp, sort_keys = True, відступ = 4)" покращує читабельність.
— фобій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.