无法使用子目录中的ConfigParser加载相对配置文件

时间:2012-12-10 11:59:18

标签: python

我有以下目录结构:

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

在foo.py中我有这个:

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

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

conf/__init__.py我有

__all__ = ["config.cfg"]

我在foo.py中遇到了这个错误,我可以通过提供完整路径来解决这个错误,但不是在我放置conf/config.cfg但我希望相对路径能够工作的时候:

ConfigParser.NoSectionError

实际上意味着无法加载文件(因此无法读取该部分)。

我已尝试在sys.path.append('conf/')中对foo.py进行评论/取消评论,但它没有做任何事情。

有什么想法吗?非常感谢。

3 个答案:

答案 0 :(得分:31)

路径是相对于当前工作目录,它通常是运行程序的目录(但是当前目录可以由程序[或模块]更改,并且它位于general not 程序文件的目录。)

解决方案包括通过Python解释器在__file__为您创建的foo.py变量自动计算文件的路径:

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

说明:每个程序(模块)的__file__变量包含其路径(相对于加载时的当前目录,我猜 - 我在Python文档中找不到任何结论)。将其转换为绝对路径更好地处理模块在config.read()之前更改当前工作目录的一般情况,其中__file__是相对路径(例如在导入foo.py时发生从它自己的目录)。

这样,无论当前的工作目录和放置包的位置,导入都能正常工作。

PS:附注:__all__ = ["config.cfg"]不是您想要的:它告诉Python您在执行from conf import *时要导入哪些符号(变量,函数)。它应该被删除。

答案 1 :(得分:0)

只需从变量加载路径,为什么这么复杂?

 from configparser import ConfigParser

 prsr=ConfigParser()
 configfile="D:\Dummy\DummySubDir\Dummy.ini"
 prsr.read(configfile)
 print(prsr.sections())

答案 2 :(得分:0)

您可以在python中使用os包来导入配置文件的绝对或相对路径。这是一个带有相对路径的工作示例(我们假设python脚本文件夹的子目录中的文件夹名称config.ini中的configuration):

import configparser
import os

path_current_directory = os.path.dirname(__file__)
path_config_file = os.path.join(path_current_directory, 'configuration', config.ini)
config = configparser.ConfigParser()
config.read(path_config_file)