2011-09-27 15 views
43

In modalità di sviluppo, ho la seguente struttura di directory:Dove mettere un file di configurazione in Python?

| my_project/ 
| setup.py 
| my_project/ 
    | __init__.py 
    | main.py 
    | conf/ 
     | myproject.conf 

Io uso ConfigParser per analizzare il file myproject.conf.

Nel mio codice, è facile per caricare il file con un buon percorso: my_project/conf/myproject.conf

Il problema è: Quando si installa il progetto utilizzando il setup.py, il file di configurazione si trovano (grazie a setup.py) nello /etc/my_project/myproject.conf e nella mia applicazione nello /usr/lib/python<version>/site-packages/my_project/.

Come posso inviare il mio file my_project/conf/myproject.conf nel mio progetto in modalità "produzione" e fare riferimento al file locale (my_project/conf/myproject.conf) in modalità "devel".

Inoltre, mi piacerebbe essere portatile se possibile (lavoro su Windows per esempio).

Qual è la buona pratica per farlo?

risposta

32

Hai visto come funzionano i file di configurazione? Leggi i file "rc", come talvolta vengono chiamati. "bashrc", "vimrc", ecc.

Di solito c'è una ricerca multi-passo per il file di configurazione.

  1. Directory locale. ./myproject.conf.

  2. home directory dell'utente (~user/myproject.conf)

  3. Una directory a livello di sistema standard (/etc/myproject/myproject.conf)

  4. un luogo chiamato da una variabile d'ambiente (MYPROJECT_CONF)

installazione Python sarebbe l'ultimo posto dove guardare.

config= None 
for loc in os.curdir, os.path.expanduser("~"), "/etc/myproject", os.environ.get("MYPROJECT_CONF"): 
    try: 
     with open(os.path.join(loc,"myproject.conf")) as source: 
      config.readfp(source) 
    except IOError: 
     pass 
+2

Questo non è come funziona in Windows, però, che la domanda ha chiesto. – endolith

+1

Questo funzionerà "su Windows".Potrebbe non essere "tipico" per Windows, ma sicuramente funziona. –

+1

Uh - perché provi a cogliere una frase con? – David

1

Non penso che ci sia un modo pulito per affrontarlo. Potresti semplicemente scegliere di testare l'esistenza del file "locale", che funzionerebbe in modalità dev. In caso contrario, tornare al percorso di produzione:

main_base = os.path.dirname(__file__) 
config_file = os.path.join([main_base, "conf", "myproject.conf"]) 

if not os.path.exists(config_file): 
    config_file = PROD_CONFIG_FILE # this could also be different based on the OS 
9

Il pacchetto appdirs fa un buon lavoro nel trovare la posizione standard per le app installate su varie piattaforme. Mi chiedo se estenderlo per scoprire o consentire una sorta di stato "disinstallato" per gli sviluppatori avrebbe senso.

2

Un'altra opzione è quella di mantenere tutti i file .cfg e .ini nella directory home, come fa "boto".

import os.path 
config_file = os.path.join(os.path.expanduser("~"), '.myproject') 
Problemi correlati