小编典典

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

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但是它什么也没做。

有任何想法吗?


阅读 208

收藏
2021-01-20

共1个答案

小编典典

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

一个解决方案包括通过__file__Python解释器在foo.py以下代码中为您创建的变量自动计算文件的路径:

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

说明:__file__每个程序(模块)的变量都包含其路径(可能是相对于当前目录的路径,在加载时,我想-
我在Python文档中找不到结论性的东西),例如,当foo.py从其自身导入时目录)。

这样,无论当前工作目录如何,以及无论您将软件包放在何处,导入都能正常工作。

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

PPS:如果代码在加载配置读取模块的时间与您读取配置文件的时间之间更改了当前的工作目录,那么您要先存储配置文件的 绝对
路径(使用os.path.abspath()),然后再更改当前目录,因此即使在当前目录更改后也可以找到配置。

2021-01-20