ConfigObj和绝对路径

时间:2013-02-25 16:10:04

标签: python path configobj

在使用configobj for python时,我遇到了一些路径问题。我想知道是否有办法在我的帮助文件中不使用绝对路径。例如,而不是:

self.config = ConfigObj('/home/thisuser/project/common/config.cfg')

我想使用类似的东西:

self.config = ConfigObj(smartpath+'/project/common/config.cfg')

背景 我已将配置文件放在辅助类和实用程序类旁边的公共目录中:

common/config.cfg
common/helper.py
common/utility.py

helper类有一个方法,它返回config部分中的值。代码是这样的:

from configobj import ConfigObj

class myHelper:

    def __init__(self):
        self.config = ConfigObj('/home/thisuser/project/common/config.cfg')

    def send_minion(self, race, weapon):
        minion = self.config[race][weapon]
        return minion

实用程序文件导入帮助文件,实用程序文件由驻留在我项目的不同文件夹中的一堆不同类调用:

from common import myHelper

class myUtility:

    def __init__(self):
        self.minion = myHelper.myHelper()

    def attack_with_minion(self, race, weapon)
        my_minion = self.minion.send_minion(race, weapon)
        #... some common code used by all
        my_minion.login()

以下文件导入实用程序文件并调用方法:

/home/thisuser/project/folder1/forestCastle.py
/home/thisuser/project/folder2/secondLevel/sandCastle.py
/home/thisuser/project/folder3/somewhere/waterCastle.py

self.common.attack_with_minion("ogre", "club")

如果我不使用绝对路径并运行forestCastle.py,它会在 / home / thisuser / project / folder1 / 中查找配置,我希望它在< strong> project / common / 因为 / home / thisuser 会更改

2 个答案:

答案 0 :(得分:0)

您可以根据模块文件名计算新的绝对路径:

import os.path
from configobj import ConfigObj

BASE = os.path.dirname(os.path.abspath(__file__))


class myHelper:

    def __init__(self):
        self.config = ConfigObj(os.path.join(BASE, 'config.cfg'))

__file__当前模块的文件名,因此helper.py的文件名为/home/thisuser/project/common/helper.py; os.path.abspath()确保它是绝对路径,os.path.dirname删除/helper.py文件名,为您提供“当前”目录的绝对路径。

答案 1 :(得分:0)

我在追求你真正想要的东西时有点困难。但是,要以与操作系统无关的方式扩展主目录的路径,可以使用os.path.expanduser

self.config = ConfigObj(os.path.expanduser('~/project/common/config.cfg'))