我有以下目录结构:
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
进行评论/取消评论,但它没有做任何事情。
有什么想法吗?非常感谢。
答案 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)