2016-08-17 70 views
0

项目结构:定位项目specifc配置文件

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

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

的问题是,当mod3.py进口mod2.pymod1.py尝试从路径相对于加载配置文件,以mod3.py(即/subdir1/subdir2/configs/config.yaml代替/configs/config.yaml)--this的当然,这是行不通的。

我相信明白为什么这不起作用(os.getcwd()获取原始执行文件的路径)。

我怎样才能解决这个问题,使mod1.py将使用相对mod2.py的路径,即使mod2.pymod3.py进口?

+0

也许重写代码以避免从相对位置加载文件将是最好的选择,但是如果你必须,看看'mod2 .__ file__' ... – twalberg

+0

问题是'mod2.py'的位置会因项目而异,但项目中的文件将始终遵循相对路径。在这个例子中,'mod1.py'是从项目结构中加载的 - 但是如果是从项目结构之外的位置加载的,mod2.py'的位置将用于建立config.yaml的位置。 – user2487593

回答

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_path然后用前缀具体的配置文件名(s)mod1.py。由于每次调用mod1.py都会发生在项目目录结构中,并且每个项目只有一个configs目录,因此应该(并且迄今为止)正确标识configs目录,而不管项目中运行给定脚本的位置。

我打开更好或更多的Pythonic方式做到这一点,如果有人有输入。