引用YAML配置文件,从Python中,当软链接被定义(Referencing a YAML con

2019-11-05 08:08发布

我有以下代码;

#!/usr/bin/env python3

import yaml

with open('config.yml', 'r') as config_file:
    config = yaml.load(config_file)

该文件称为__init__.py这是在目录~/bin/myprogram/myprogram/并在同一目录中,我有一个名为config.yml

我的符号链接如下;

user$ ls -la /usr/local/bin/

lrwxr-xr-x    1 user  admin        55 27 Nov 13:25 myprogram -> /Users/user/bin/myprogram/myprogram/__init__.py

我每次运行myprogram,我得到的错误FileNotFoundError: [Errno 2] No such file or directory: 'config.yml' 。 我相信这是因为config.yml不是/usr/local/bin/ 。 什么是解决这个问题的最佳方式是什么?

Answer 1:

您可以使用__file__访问的位置__init__.py在该文件中执行代码时文件。 它返回的完整路径,但小心,必须考虑,因为它可能是.pyc (或.pyo )版本。 由于您使用Python3我会用pathlib模块:

import yaml
import pathlib

my_path = Path(__file__).resolve()  # resolve to get rid of any symlinks
config_path = my_path.parent / 'config.yaml'

with config_path.open() as config_file:
    config = yaml.safe_load(config_file)

请注意:

  • 如果你必须使用PyYAML,使用safe_load()甚至PyYAML自己的文件表明.load()可能是不安全的。 它几乎从来没有必要使用。 而在万一safe_load()不能加载您的配置,例如,如果它有!!python/...标签,你应该明确地添加注册,你真正需要的类SafeLoader )。

  • 自2006年9月的对YAML文件建议延长一直.yaml



文章来源: Referencing a YAML config file, from Python, when a softlink is defined