2012-12-10 6 views
15

Ho la seguente struttura di directory:Impossibile caricare il file di configurazione relativa utilizzando ConfigParser dalla sotto-directory

my_program/ 
     foo.py 
     __init__.py # empty 
     conf/ 
      config.cfg 
      __init__.py 

In foo.py ho questo:

import sys 
#sys.path.append('conf/') 
import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read('conf/config.cfg') 

In conf/__init__.py ho

__all__ = ["config.cfg"] 

Ho ricevuto questo errore in foo.py che posso risolvere dando il percorso completo ma non quando ho appena messo conf/config.cfg ma voglio che il percorso relativo al lavoro:

ConfigParser.NoSectionError 

che significa in realtà che il file non può essere caricato (in modo che non può leggere la sezione).

Ho provato a commentare/non commentare sys.path.append('conf/') in foo.py ma non fa nulla.

Qualche idea? Grazie molto.

+0

Se la risposta ha risolto il problema, sarebbe utile contrassegnarlo come accettato ... :) – EOL

risposta

21

percorsi sono relativi alla directory corrente lavoro, che di solito è la directory da cui si esegue il programma (ma la directory corrente può essere modificata dal programma [o un modulo] ed è, in generale, non la directory del tuo file di programma).

Una soluzione consiste nel calcolare automaticamente il percorso del file, attraverso la variabile __file__ che l'interprete Python crea per voi in foo.py:

import os 
config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'conf', 'config.cfg')) 

Spiegazione: La __file__ variabili di ciascun programma (modulo) contiene il suo path (relativo alla directory corrente quando è stato caricato, credo - non ho trovato nulla di conclusivo nella documentazione di Python). La conversione in un percorso assoluto gestisce meglio il caso generale in cui il modulo modifica la directory di lavoro corrente prima di config.read() e dove __file__ è un percorso relativo (che si verifica ad esempio quando foo.py viene importato dalla propria directory).

In questo modo, l'importazione funziona correttamente indipendentemente dalla directory di lavoro corrente e da qualsiasi luogo si inserisca il pacchetto.

PS: Nota a fianco: __all__ = ["config.cfg"] non è ciò che si desidera: indica a Python quali simboli (variabili, funzioni) importare quando si esegue from conf import *. Dovrebbe essere cancellato.

+0

Grazie. Stesso problema se ho paura: 'importazione os' ' importazione ConfigParser' 'config = ConfigParser.ConfigParser()' ' config.read (os.path.join (os.path.dirname (__FILE__) , 'conf', 'config.cfg')) ' genera lo stesso errore di prima. Ho rimosso il '__all__ = [" config.cfg "]' anche – ale

+0

Se stampo il percorso, allora dice correttamente './Conf/config.cfg' che è strano! – ale

+0

Puoi provare con la versione aggiornata della risposta? usa un percorso assoluto invece di uno possibilmente relativo. – EOL

Problemi correlati