34

我有以下目录结构:

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但它没有做任何事情。

有任何想法吗?

4

3 回答 3

56

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

__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()) , 这样即使在当前目录更改后也能找到配置。

于 2012-12-10T12:04:20.803 回答
2

您可以os在 python 中使用包来导入配置文件的绝对或相对路径。这是一个具有相对路径的工作示例(我们假设在您的 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)
于 2020-03-09T15:44:44.907 回答
-5

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

 from configparser import ConfigParser

 prsr=ConfigParser()
 configfile="D:\Dummy\DummySubDir\Dummy.ini"
 prsr.read(configfile)
 print(prsr.sections())
于 2019-10-22T17:13:07.427 回答