2012-12-10 19 views
15

den ConfigParser kullanılarak nispi yapılandırma dosyası yüklenemiyor: Ben foo.py olarakAşağıdaki dizin yapısını gelmiş alt dizinden

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

var bu: Ben

var conf/__init__.py yılında

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

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

__all__ = ["config.cfg"] 

Bu hatayı foo.py numaralı telefondan aldığımdan tam yolu vererek düzeltebiliyorum Sadece conf/config.cfg koymak ama istediğim zaman göreli yolu çalışmak için:

aslında dosya yüklenemiyor demektir
ConfigParser.NoSectionError 

(yani bölümünü okuyun olamaz).

foo.py'da sys.path.append('conf/') yorumunu/yorumunu denedim ancak hiçbir şey yapmıyor.

Herhangi bir fikrin var mı? Çok teşekkürler.

+0

Yanıt sorununuzu çözdüyse, kabul edildi olarak işaretlemek yararlı olur… :) – EOL

cevap

21

Yollar programınızı çalıştırın (ancak mevcut dizin programınız [veya bir modül] değiştirilebilir hangi dizin genellikle geçerli çalışma dizini, göredir ve genel değil içindedir program dosyanızın dizini).

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

Açıklama:

bir çözüm otomatik foo.py yılında Python yorumlayıcısı sizin için yarattığı __file__ değişken üzerinden dosyanızın yolunu hesaplanmasında ibarettir her programın __file__ değişkeni (modülü) içerir onun yol (yüklendiğinde geçerli dizine göre, sanırım - Python belgelerinde kesin bir şey bulamadım). Bunu mutlak bir yola dönüştürmek, modülün geçerli çalışma dizinini config.read()'dan önce değiştirdiği ve __file__'un göreli bir yol olduğu genel durumu (örneğin, foo.py kendi dizininden içe aktarıldığında gerçekleşir) genel durumu ele alır.

Bu şekilde, içe aktarma, geçerli çalışma dizini ne olursa olsun ve paketinizi nereye koyduğunuzda doğru çalışır.

Not: Yan not: __all__ = ["config.cfg"] ne istediğinizi değil: Python'a, from conf import * öğelerini ne zaman (değişkenler, işlevler) içe aktarılacağını söyler. Silinmelidir.

+0

Teşekkür ederiz. Korkarım olsa aynı sorun: 'ithalat os'' ithalat ConfigParser' 'yapılandırma = ConfigParser.ConfigParser()' 'config.read (os.path.join (os.path.dirname (__FILE__) 'conf', 'config.cfg')) ' önceki ile aynı hata yükseltir. '__all__ = ["config.cfg"] 'yi de kaldırdım. – ale

+0

Yolu yazdıysam düzgün bir şekilde'./Conf/config.cfg' der ki bu garip! – ale

+0

Cevabın güncellenmiş sürümü ile deneyebilir misiniz? Muhtemelen görece biri yerine mutlak bir yol kullanır. – EOL

İlgili konular