Переменные среды Sublime Text отсутствуют

#python #plugins #environment-variables #sublimetext3 #pipenv

#python #Плагины #переменные среды #sublimetext3 #pipenv

Вопрос:

Я установил yapf и PyYapf пакет (https://github.com/jason-kane/PyYapf ) для форматирования кода sublime text для Python. Кроме того, для моих проектов на Python я использую pipenv .

При выполнении команды форматирования в sublime я получаю следующую ошибку

 Traceback (most recent call last):
  File "~/.pyenv/versions/3.6.8/bin/pipenv", line 10, in <module>
    sys.exit(cli())
  File "~/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "~/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 696, in main
    _verify_python3_env()
  File "~/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pipenv/vendor/click/_unicodefun.py", line 124, in _verify_python3_env
    ' mitigation steps.'   extra
RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Consult https://click.palletsprojects.com/en/7.x/python3/ for mitigation steps.

This system supports the C.UTF-8 locale which is recommended.
You might be able to resolve your issue by exporting the
following environment variables:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8 
  

Теперь я попробовал предложение использовать два вышеупомянутых экспорта и установить их глобально в своем профиле (и перезагрузить компьютер).
Открываем терминал и проверяем, что они, кажется, доступны:

 $printenv | grep "C.UTF-8"
LC_ALL=C.UTF-8
LANG=C.UTF-8
  

Однако sublime text по-прежнему выдает исходную ошибку. Глядя на исходный код пакета, среда считывается следующим образом внутри PyYapf.py пакета:

 self.popen_env = os.environ.copy()
  

При печати содержимого self.popen_env тогда LANG и LC_ALL , похоже, не установлены или не имеют C.UTF-8 значения.

Откуда sublime text получает envs?

Комментарии:

1. Вы используете Linux или macOS?

2. Я на Linux MInt 19

3. Насколько мне известно, os.environ() следует напрямую предоставлять вам среду запущенного процесса. Я бы предложил перезапустить, чтобы убедиться, что dock / launcher наследует новую среду, но вы уже это сделали. Вы получаете разные результаты, если запускаете Sublime с терминала (после проверки переменных, как указано выше)?

4. Я всегда запускаю sublime с терминала, так что это должно давать ему те же переменные, которые я получаю с printenv в терминале, или нет?

5. Я бы предположил, что это так. В прошлом у меня были похожие проблемы с этими самыми переменными, и установка их в терминале и запуск оттуда работали, а значок запуска — нет.

Ответ №1:

Быстрое решение:

 $ cd ~/.config/sublime-text-3/Packages
$ mkdir -p Default
$ echo 'import os; os.environ["LC_ALL"] = os.environ["LANG"] = "C.UTF-8"' > Default/echo.py
  

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

Для Linux Mint и других вариантов Debian просто запустите $ sudo dpkg-reconfigure locales и отметьте en_US.UTF-8 (или любой другой язык, который вы предпочитаете) в списке. Следуйте этим двум постам для получения более подробной информации об ошибках локали.