从导入的模块中找到项目特定的配置文件

时间:2016-08-17 17:17:17

标签: python-2.7

项目结构:

/lib/modules/mod1.py  
/mod2.py  
/subdir1/subdir2/mod3.py  
/configs/config.yaml  

mod3.py导入mod2.pymod2.py导入mod1.pymod1.py使用mod2.py加载os.getcwd()相对路径的配置文件。

问题是当mod3.py导入mod2.py时,mod1.py会尝试从相对于mod3.py的路径加载配置文件(即/ subdir1 / subdir2 / configs / config.yaml而不是/configs/config.yaml)--这当然不起作用。

我相信理解为什么这不起作用(os.getcwd()获取最初执行文件的路径。)

如何解决这个问题,以便即使从mod1.py导入mod2.pymod2.py也会使用相对于mod3.py的路径?

1 个答案:

答案 0 :(得分:0)

我还没有找到在Python中执行此操作的内置方法,所以我最终做的是:

mod1.py:
configs_list = os.getcwd().split('/')
for x in configs_list:
    # Check each directory in list, bottom up. 'pop()' list on
    # each failure. Assign var and break loop when configs path is found.
    if not os.path.exists('/'.join(configs_list) + '/configs'):
        configs_list.pop()
    else:
        configs_path = '/'.join(configs_list) + '/configs'
        break
然后使用

configs_pathmod1.py中的特定配置文件名添加前缀。由于对mod1.py的每次调用都是在项目的目录结构中进行的,并且每个项目只有一个configs目录,所以这应该(并且到目前为止)正确识别{{1}无论项目在哪里运行给定的脚本,都无论目录。

如果有人有意见的话,我会接受更好或更多的Pythonic方式。