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

ale*_*ale 21 python

我有以下目录结构:

my_program/
       foo.py
       __init__.py # empty
       conf/
          config.cfg
          __init__.py 
Run Code Online (Sandbox Code Playgroud)

在foo.py我有这个:

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

config = ConfigParser.ConfigParser()
config.read( 'conf/config.cfg' )
Run Code Online (Sandbox Code Playgroud)

conf/__init__.py我有

__all__ = ["config.cfg"]
Run Code Online (Sandbox Code Playgroud)

我得到这个错误,foo.py因为我可以通过提供完整路径来修复,但不是在我刚刚放置时conf/config.cfg但是我想要相对路径工作:

ConfigParser.NoSectionError
Run Code Online (Sandbox Code Playgroud)

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

我试过评论/取消评论sys.path.append('conf/'),foo.py但它没有做任何事情.

有任何想法吗?非常感谢.

Eri*_*got 36

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

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

import os
config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'conf', 'config.cfg'))
Run Code Online (Sandbox Code Playgroud)

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

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

PS:旁注:__all__ = ["config.cfg"]不是你想要的:它告诉Python你要导入什么符号(变量,函数)from conf import *.它应该被删除.