Qual é a melhor prática usando um arquivo de configurações no Python? [fechadas]

332

Eu tenho um script de linha de comando que corro com muitos argumentos. Agora cheguei a um ponto em que tenho muitos argumentos e também quero ter alguns argumentos na forma de dicionário.

Portanto, para simplificar, gostaria de executar o script com um arquivo de configurações. Realmente não sei quais bibliotecas usar para a análise do arquivo. Qual é a melhor prática para fazer isso? É claro que eu poderia elaborar algo, mas se houver alguma biblioteca para isso, sou todo ouvidos.

Algumas 'demandas':

  • Em vez de usar pickle, gostaria que fosse um arquivo de texto direto que possa ser facilmente lido e editado.
  • Eu quero poder adicionar dados semelhantes a dicionários, ou seja, alguma forma de aninhamento deve ser suportada.

Um arquivo de pseudo exemplo simplificado:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2
c00kiemonster
fonte
6
A sintaxe específica desse arquivo de exemplo é realmente YAML, verifique a resposta de Benson.
Skippy le Grand Gourou

Respostas:

231

Você pode ter um módulo Python comum, digamos config.py, assim:

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

e use-o assim:

import config
print config.truck['color']  
dugres
fonte
69
É uma péssima idéia, como se você deseja permitir que usuários com privilégios baixos possam alterar apenas os arquivos de configuração, dessa forma você está essencialmente permitindo que eles ocultem o código privilegiado.
Nikolay
172
Permitir que usuários com "baixo privilégio" alterem a configuração de um programa mais privilegiado provavelmente é uma configuração questionável.
XTL
18
Você também pode ter problemas ao empacotar seu projeto para implantação usando uma ferramenta como py2app. O usuário pode não conseguir editar o arquivo de configuração depois de distribuído, pois isso invalidaria a assinatura do aplicativo.
bschwagg
18
A principal desvantagem disso (opção muito conveniente) é que os .pyarquivos são executáveis; portanto, qualquer tipo de código pode ser executado ao tentar carregar a configuração import. Isso é inaceitável do ponto de vista de segurança.
Apalala 9/02
5
Não é possível fazer uma versão disso com segurança ast.literal_eval? docs.python.org/3/library/ast.html#ast.literal_eval
André C. Andersen
169

A configuração de amostra que você forneceu é realmente YAML válido . De fato, o YAML atende a todas as suas demandas, é implementado em um grande número de idiomas e é extremamente amigável ao ser humano. Eu recomendo que você o use. O projeto PyYAML fornece um bom módulo python, que implementa o YAML.

Para usar o módulo yaml é extremamente simples:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))
Benson
fonte
3
yaml é sempre algo para o qual recorro; o formato pode variar de simples a suportar código python incorporado, e a biblioteca padrão faz o trabalho pesado de análise e saneamento para você.
Todor Minakov 10/10
15
Acordado. Para você ou usuários que escrevem YAML, eis a melhor referência de YAML que eu conheço . A documentação oficial é, infelizmente, uma especificação que visa implementadores, e nada mais, mas guia de Eevee é fantástico.
Esteis
5
Para nós não iniciados, é pip3 install pyyamlpara prepará-lo para a importação em scripts python.
user8675309
2
Cuidado, o yaml só é amigável se você o mantiver muito simples, pois por padrão possui toneladas de problemas, fazendo fronteira com recursos inseguros. Experimente hitchdev.com/strictyaml como alternativa alternativa segura por padrão.
Gringo Suave
107

Achei o mais útil e fácil de usar https://wiki.python.org/moin/ConfigParserExamples

Você acabou de criar um "myfile.ini" como:

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

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

[Others]
Route: 66

E recupere os dados como:

>>> 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'
Maviles
fonte
20
Para Python 3 utilização do ConfigParser módulo vez (em letras minúsculas)
Roland
2
Essa é a solução mais rápida, clara e fácil de implementar, pois não há implementação, apenas uso. :) Obrigado!
Aleksandar
Isso suportaria dicionários aninhados, conforme solicitado na pergunta?
Jakub Bláha 6/12/19
54

Yaml e Json são os formatos de arquivo mais simples e mais usados ​​para armazenar as configurações / configurações. PyYaml pode ser usado para analisar yaml. Json já faz parte do python da 2.5. Yaml é um superconjunto de Json. O Json resolverá a maioria dos casos de uso, exceto cadeias de linhas múltiplas, nas quais é necessário escapar. Yaml também cuida desses casos.

>>> 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}
Anoop
fonte
13
Embora seja mais ou menos equivalente, o json não é tão legível por humanos quanto o yaml. Como a configuração de amostra é realmente yaml válido, eu enfatizaria isso em vez de json.
Benson
23
O uso de "json.dump (config, fp, sort_keys = True, indent = 4)" melhora a legibilidade.
Phobie 01/07/2013