it-swarm.com.ru

Зарегистрируйте настраиваемые переменные среды с помощью anaconda

Запустив conda env export > environment.yml Я могу упростить клонирование и репликацию моего окружения.

Но мне также нужно, чтобы они установили некоторые переменные среды. При использовании PHP (Laravel) у меня был файл .env (игнорируемый git), в который пользователь мог поместить данные учетной записи, пароли, токены и т.д. Был предоставлен файл .env.example, позволяющий пользователю видеть требуемые значения. Так что я реализовал это с помощью класса python, но он был осужден в r/learnpython («... чтобы дать пользователю возможность повеситься»).

После дальнейшего чтения я сделал файл activate в корне моего проекта

export \
    GITHUB_ACCESS_TOKEN="your value goes here", 
    BENNO="test",

Таким образом, пользователь теперь просто запускает source activate для регистрации переменных. Но я вижу несколько проблем

  • activate стремится, как защитить пользователя от случайной публикации этого?
  • После выхода из моей среды conda переменная GITHUB_ACCESS_TOKEN все еще была активной. Я ожидал, что среда conda сохранит отдельный набор переменных среды?
  • Пользователь должен запускать скрипт активации каждый раз, когда перезапускает терминал
  • Скрипт активации не поддерживает использование Windows
  • Принцип все тот же, что и .env.example в PHP, что плохо ??

Подводя итог, я хотел бы, чтобы простой и понятный способ хранения как зависимостей, так и настраиваемых переменных среды позволял выполнять простую установку для пользователей conda, а также, по возможности, для более широкого круга пользователей python. Каковы некоторые хорошие практики здесь? Можно ли как-то перечислить vars в environment.yml?

4
Anders

Как @Strom говорит, что мое оригинальное решение не так уж плохо. В конечном итоге уточнил, как описано ниже.


Сначала давайте установим python-dotenv 

conda install -c conda-forge python-dotenv -n my-environment-name

Затем создайте файл env.example в вашем корне со значениями, которые ваш пользователь должен предоставить

GITHUB_ACCESS_TOKEN=PUT_YOUR_TOKEN_HERE

Изменить .gitignore (я рекурсивно игнорирую любой .env)

**/.env

В вашей точке входа в скрипт, загрузочный файл или где вы считаете нужным сделать

from dotenv import load_dotenv
load_dotenv()

Наконец, теперь вы сможете получить доступ к переменным из любой точки вашего приложения, выполнив

import os
print(os.getenv("GITHUB_ACCESS_TOKEN"))


Обратите внимание на это! (Спасибо, Алекс и Хенрик)

Настоятельно не рекомендуется, потому что вы обычно не хотите рисковать некоторые dingus переопределяют gitignore и фиксируют файл, полный секреты вашего репо. Обычно вы хотите разрешить развертывание решение или услуга, как ручка HashiCorp Vault инъекции вашего env vars, а не хранить файл в файловых системах вашей среды.

Так что не связывайтесь с вашими env файлами в производстве.


Ссылка: https://github.com/theskumar/python-dotenv

Другое возможное решение, которое я еще не пробовал: https://github.com/direnv/direnv

0
Anders

Я предпочитаю ваше оригинальное решение. До тех пор, пока в файле README и в комментариях достаточно предупреждений, игнорируйте аргументы «веревки». Невозможно создать надежную систему. Если вы хотите проверить, добавьте переменную Environment, которая не позволяет вашей среде по умолчанию работать как есть. Это будет гарантировать, что среда была изменена для использования, или, по крайней мере, пользователь должен был посмотреть файл.

Принуждение пользователя переименовать файл примера и проверить его, как описано выше, решает проблемы, представленные здесь. 

1
Strom