Ссылка на файл конфигурации YAML из Python, когда определена программная ссылка - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий код:

#!/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

Каждый раз, когда я запускаю мою программу, я получаю ошибку FileNotFoundError: [Errno 2] No such file or directory: 'config.yml'.Я считаю, что это потому, что config.yml не в /usr/local/bin/.Как лучше обойти эту проблему?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете использовать __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 рекомендуемое расширение для файлов YAML было .yaml

...