项目结构:
/lib/modules/mod1.py
/mod2.py
/subdir1/subdir2/mod3.py
/configs/config.yaml
mod3.py
导入mod2.py
。 mod2.py
导入mod1.py
。 mod1.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.py
,mod2.py
也会使用相对于mod3.py
的路径?
答案 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_path
为mod1.py
中的特定配置文件名添加前缀。由于对mod1.py
的每次调用都是在项目的目录结构中进行的,并且每个项目只有一个configs
目录,所以这应该(并且到目前为止)正确识别{{1}无论项目在哪里运行给定的脚本,都无论目录。
如果有人有意见的话,我会接受更好或更多的Pythonic方式。