Яка найкраща практика використання файлу налаштувань у 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.