Qual è la migliore pratica usando un file di impostazioni in Python? [chiuso]


332

Ho uno script da riga di comando che eseguo con molti argomenti. Sono giunto a un punto in cui ho troppi argomenti e voglio avere anche alcuni argomenti in forma di dizionario.

Quindi, al fine di semplificare le cose, vorrei invece eseguire lo script con un file di impostazioni. Non so davvero quali librerie usare per l'analisi del file. Qual è la migliore pratica per farlo? Ovviamente potrei martellare qualcosa da solo, ma se c'è una biblioteca per questo, sono tutto orecchie.

Alcune "richieste":

  • Piuttosto che usare pickle, vorrei che fosse un semplice file di testo che può essere facilmente letto e modificato.
  • Voglio essere in grado di aggiungere dati simili a un dizionario, vale a dire, dovrebbe essere supportata una qualche forma di annidamento.

Un file pseudo di esempio semplificato:

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

6
La sintassi particolare di questo file di esempio è in realtà YAML, controlla la risposta di Benson.
Skippy le Grand Gourou,

Risposte:


231

Puoi avere un normale modulo Python, ad esempio config.py, in questo modo:

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

e usalo così:

import config
print config.truck['color']  

69
Questa è una pessima idea come se si volesse consentire agli utenti con privilegi limitati di poter modificare solo i file di configurazione, in questo modo essenzialmente si consente loro di intrufolarsi nel codice privilegiato.
nikolay,

172
Consentire agli utenti "con privilegi limitati" di modificare la configurazione per un programma più privilegiato è probabilmente una configurazione discutibile.
XTL

18
Potresti anche riscontrare problemi nel confezionare il tuo progetto per la distribuzione usando uno strumento come py2app. L'utente potrebbe non essere in grado di modificare il file di configurazione una volta distribuito poiché invaliderebbe la firma dell'app.
bschwagg,

18
Lo svantaggio principale di questa (opzione altrimenti molto conveniente) è che i .pyfile sono eseguibili, quindi è possibile eseguire qualsiasi tipo di codice durante il tentativo di caricare la configurazione import. È inaccettabile dal punto di vista della sicurezza.
Apalala,

5
Una versione non può essere eseguita in modo sicuro con ast.literal_eval? docs.python.org/3/library/ast.html#ast.literal_eval
André C. Andersen

169

La configurazione di esempio che hai fornito è in realtà YAML valida . In effetti, YAML soddisfa tutte le vostre esigenze, è implementato in un gran numero di lingue ed è estremamente amico dell'uomo. Consiglio vivamente di usarlo. Il progetto PyYAML fornisce un bel modulo Python, che implementa YAML.

Utilizzare il modulo yaml è estremamente semplice:

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

3
yaml è sempre qualcosa a cui mi rivolgo; il formato può essere dal semplice al supporto del codice Python incorporato e la libreria standard fa il pesante sollevamento di analisi e servizi igienico-sanitari per te.
Todor Minakov,

15
Concordato. Per te o gli utenti che scrivono YAML, ecco il miglior riferimento YAML che io conosca . La documentazione ufficiale è purtroppo una specifica rivolta agli implementatori e nient'altro, ma la guida di Eevee è fantastica.
Esteis,

5
Per noi non iniziati, questo pip3 install pyyamlè pronto per l'importazione in script Python.
user8675309

2
Attenzione, yaml è amichevole solo se lo mantieni molto semplice, per impostazione predefinita ha tonnellate di problemi, al limite di funzionalità non sicure. Prova hitchdev.com/strictyaml invece come alternativa lite sicura per impostazione predefinita.
Gringo Suave,

107

Ho trovato questo il più utile e facile da usare https://wiki.python.org/moin/ConfigParserExamples

Devi solo creare un "myfile.ini" come:

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

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

[Others]
Route: 66

E recupera i dati come:

>>> 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
Per Python 3 usa invece il modulo configparser (tutto minuscolo)
Roland

2
Questa è la soluzione più veloce, chiara e facile da implementare, poiché non c'è implementazione, solo utilizzo. :) Grazie!
Aleksandar,

Supporterebbe questo dizionario nidificato come richiesto nella domanda?
Jakub Bláha il

54

Yaml e Json sono i formati di file più semplici e più comunemente usati per memorizzare le impostazioni / config. PyYaml può essere usato per analizzare yaml. Json fa già parte di Python dalla 2.5. Yaml è un superset di Json. Json risolverà la maggior parte dei casi d'uso ad eccezione delle stringhe multilinea in cui è richiesta l'escaping. Yaml si occupa anche di questi casi.

>>> 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
Sebbene più o meno equivalente, Json non è leggibile quasi come lo yaml. Dal momento che la sua configurazione di esempio è effettivamente valida, lo sottolineerei invece di JSON.
Benson,

23
L'uso di "json.dump (config, fp, sort_keys = True, indent = 4)" migliora la leggibilità.
phobie,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.