Doom-emacs: Проблемы с автоматической установкой версии pyenv (ветка разработки)

Созданный на 1 июл. 2018  ·  33Комментарии  ·  Источник: hlissner/doom-emacs

Во-первых, мне очень нравится Doom, так что спасибо за всю вашу работу над ним!

Наблюдаемое поведение

Когда я загружаю проект с определенной версией Python, установленной с использованием файла .python-version в каталоге проекта, эта версия python не загружается должным образом. В модельной строке отображается «Python 2.7.14» вместо «Python 3.6.5».

Если я выполняю :!pyenv version в emacs, он сообщает:

"2.7.14 (устанавливается переменной среды PYENV_VERSION)"

Это наводит на мысль, что он каким-то образом получает версию pyenv shell , но я ее не установил. Использование этой команды в терминале возвращает «pyenv: не настроена версия для конкретной оболочки». echo $PYENV_VERSION пусто.

pyenv version в терминале за пределами отчетов emacs (правильно) 3.6.5. Кроме того, у меня глобальный pyenv установлен на 3.6.5, поэтому он должен быть загружен, если я не нахожусь в каталоге, где я указываю другую версию.

Ожидаемое поведение

Модельная строка должна сообщать правильную версию pyenv (либо версию, установленную в pyenv global, либо версию для конкретного каталога из файла .python-version.

Действия по воспроизведению

  1. Откройте файл Python в Doom
  2. Модель сообщает неверную версию pyenv
  3. Как следствие, Mx run-python приводит к ошибке, потому что у меня не установлен iPython для 2.7.14 python.

Системная информация


Нажмите, чтобы развернуть

- OS: darwin (x86_64-apple-darwin17.5.0)
- Emacs: 26.1 (Jun 12, 2018)
- Doom: 2.0.9 (develop 5e9f74c269706fd840e76523555ed648a12bdab1)
- Graphic display: t (daemon: nil)
- System features: JPEG RSVG IMAGEMAGICK NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES THREADS LCMS2
- Details:
  ```elisp
  elc count: 0
  uname -a:  Darwin serenity 17.6.0 Darwin Kernel Version 17.6.0: Tue May  8 15:22:16 PDT 2018; root:xnu-4570.61.1~1/RELEASE_X86_64 x86_64
  modules:   (:feature (evil +everywhere) file-templates (lookup +devdocs +docsets) snippets spellcheck (syntax-checker +childframe) workspaces :completion (ivy +fuzzy +childframe) :ui doom-dashboard doom-modeline doom-quit evil-goggles hl-todo nav-flash neotree (popup +all +defaults) vc-gutter vi-tilde-fringe window-select :editor :emacs ediff electric eshell imenu term vc :tools ein macos magit :lang emacs-lisp latex markdown (org +attach +babel +capture +export +present +ipython) (python +conda) sh web :config)
  packages:  n/a
  exec-path: (/usr/local/bin/ /usr/bin/ /bin/ /usr/sbin/ /sbin/ /opt/X11/bin/ /Library/TeX/texbin/ /usr/local/Cellar/emacs-plus/26.1/libexec/emacs/26.1/x86_64-apple-darwin17.5.0/)
  ```

Благодаря!

:lang python bug env

Самый полезный комментарий

Я подозреваю, что вам нужно добавить ~ / .pyenv / shims к вашему PATH в вашем файле ~ / .profile.

export PATH=~/.pyenv/shims:$PATH

Все 33 Комментарий

Если вы запустите Emacs в MacOS, и если вы запустите Emacs из Dock, у вас может возникнуть та же проблема, что и у меня. MacOS произвела странную вещь с переменными окружения при запуске из Dock или LaunchPad, так что $ PATH не синхронизируется с вашей реальной оболочкой.

Мой текущий обходной путь - создать сценарий в / usr / local / bin, содержимое которого:

#!/usr/bin/env zsh
(/usr/local/Cellar/emacs-mac/emacs-26.1-z-mac-7.1/Emacs.app/Contents/MacOS/Emacs "$@") &

Вам необходимо обновить этот сценарий в соответствии с вашими настройками, такими как оболочка, которую вы используете, и место, где у вас установлен emacs. Но этот способ обычно решает проблему $ PATH.

Я запускал Emacs от Альфреда, так же эффективно, как запуск из Dock или LaunchPad. Однако использование предоставленного вами сценария отлично запускает Emacs, но, к сожалению, не решает мою проблему pyenv. Я просто получаю те же результаты, что и выше. В emacs (getenv PATH) дает мне тот же путь, что и в оболочке (включая путь прокладок pyenv). Это немного сбивает с толку!

@bsag Не могли бы вы сказать мне, правильную ли версию содержит переменная +python-current-version ?

Нет, возвращается:
«2.7.14»

В этом каталоге есть файл .python_version, который определяет «photo2hugo», и запуск python --version в этом каталоге в терминале возвращает «Python 3.6.5».

pyenv global тоже 3.6.5

У меня есть 2.7.14 как одна из версий python, доступных для pyenv, но, насколько мне известно, она не активирована ни в одной из моих сред.

Спасибо за расследование!

Привет, я тоже встретил ту же проблему.

И + python-current-version возвращает nil, а + python-pyenv-versions возвращает 3.6.5.

Отмечает, что он хорошо работает под emacs --nw, но не запускается с графическим интерфейсом под OSX 10.13

Я предложил возможное исправление для этого. Пока каталог прокладок pyenv находится в вашем PATHexec-path , по расширению), +python-current-version должен содержать текущую версию. Пожалуйста, обновите и дайте мне знать, если это так.

Привет, Хлисснер, спасибо за обновление.

После обновления он по-прежнему работает не так, как ожидалось, и у меня

  1. + python-current-versions возвращает

Его значение - 2.7.15 (в то время как + python-pyenv-versions возвращает 3.6.5)
Локально в буфере bigpydir.py (мои файлы); глобальное значение равно нулю

При установке автоматически становится локальным в буфере

2.> echo $ PATH
/Users/yanbo/.pyenv/shims:/Users/yanbo/.jenv/shims:/Users/yanbo/.jenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/ usr / bin: / sbin: / bin: / usr / games: / usr / local / games: /Users/yanbo/.composer/vendor/bin: /Users/yanbo/.rvm/bin

Привет, @hlissner , боюсь, у меня был тот же опыт, что и у @Yanbo. Это по-прежнему не работает, и, что еще более странно, у меня сейчас, похоже, нет + python-current-version, доступной для Mx. Я попытался закомментировать строку python в моем init.el, чтобы удалить, а затем переустановить ее, чтобы убедиться, что что-то не случилось, но у меня все еще нет + python-current-version.

Как бы то ни было, я также попробовал установить pyenv-mode . Это работает так, как ожидалось: я могу использовать Mx pyenv-mode-set для выбора из моих доступных версий pyenv python и фрагмент в нижней части readme для автоматического переключения на pyenv env, названный так же, как мой проект, при переключении на проект . Текст модели остается на Python 2.7.14, но правильная версия python загружается при использовании run-python, запуске REPL и при запросе версии pyenv с помощью :!pyenv version .

Хм, любопытно. Теперь работает ... вроде как.

В рамках попытки отладки некоторых проблем, которые у меня возникли при запуске R REPL через ESS, когда я запускал Emacs как emacsclient, я добавил эти строки в свой .config.el:

(require 'exec-path-from-shell)
(exec-path-from-shell-initialize)

Это означало, что ESS может найти мой двоичный файл R, и когда мне довелось запустить рабочую область на основе Python, я обнаружил, что модельная линия теперь сообщает правильную версию pyenv, а Python REPL запускается правильно. Однако автозаполнение не работает, и я часто получаю следующее сообщение об ошибке:

Собственное завершение оболочки отключено с использованием отката
Ошибка сервера: TypeError («__ init __ () получил неожиданный аргумент ключевого слова 'среда'»,)

Возможно, что-то связанное с языковым сервером, но у меня в этой виртуальной среде установлен python-language-server (v 0.17.1). В любом случае, думаю, прогресс!

@bsag Вы все это время использовали Emacs через демон? Это многое объяснило бы, потому что Doom использует exec-path-from-shell , но только в сеансах графического интерфейса (не сеансы демона или терминала, потому что ожидается, что они были запущены из разумной среды оболочки, что, оглядываясь назад, не так). верно для демона в MacOS, если он не был запущен вручную через emacs --daemon , а не через launchctl или brew services ).

_Без этих строк exec-path-from-shell в вашей конфигурации, и если вы запустите демон через emacs --daemon , будет ли обнаружена правильная версия pyenv?

Я только что попробовал то, что вы предлагаете, и он не сообщает правильный pyenv при запуске из emacs --daemon.

В любом случае, запускать его НЕ через графический интерфейс - это то, что я пробовал недавно (я должен был объяснить). Когда я первоначально сообщил об этом, я запускал прямо из графического интерфейса (т.е. запускал Emacs.app, который устанавливает homebrew). Это показало неправильную версию pyenv.

Затем в эти выходные я возился и решил попробовать воспользоваться сервисом launchctl, предоставляемым brew. Как вы указываете, он не устанавливает путь должным образом, поэтому я обнаружил, что мне пришлось использовать эти строки, чтобы заставить его распознать путь, который, похоже, (частично, по крайней мере, хотя что-то в среде нарушено Я не понимаю).

У меня такая же проблема. +1

Я продвинулся вперед в модуле lang / python; Поддержка pyenv, pyvenv и pipenv, а также улучшена поддержка conda. Переписано отображение информации о версии / env в строке режима. И Doom изменил свою философию взаимодействия с вашей средой pyenv / pyvenv / conda.

Старый способ: Doom будет пытаться угадать правильный env всякий раз, когда вы запускаете python-режим.

Новый способ: переключение env / version теперь выполняется вручную и глобально с помощью M-x и команд, предоставляемых плагинами pyenv-mode, pyvenv и conda Emacs:

  • pyenv: pyenv-mode-set и pyenv-mode-unset
  • pyvenv: pyvenv-activate и pyvenv-deactivate
  • conda: conda-env-activate и conda-env-deactivate
  • pipenv: pipenv-activate и pipenv-deactivate (РЕДАКТИРОВАТЬ)

Почему это изменение: попытка «угадать» правильный env чревата ошибками. Плагины принудительно манипулируют средой процесса Emacs, что искажает результаты любого внешнего процесса, созданного из Emacs. Это слишком непредсказуемо, и в Emacs нет понятия «буферные локальные окружения».

Это может расстраивать людей, просматривающих файлы python в разных проектах с разными требованиями / средами, но в этом случае его поведение гораздо более предсказуемо.

РЕДАКТИРОВАТЬ: Единственное исключение из всего этого - pipenv. Версия python в строке режимов учитывает текущий env pipenv (и для этого не нужно устанавливать или читать какие-либо envvars). Так что pipenv получает первоклассную поддержку.


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

О, и забыл упомянуть, что lang / python теперь также имеет следующие флаги модуля для включения этих (или других) функций:

  • +pyenv
  • +pyvenv
  • +conda
  • +ipython

Отлично, работает! Однако, когда я устанавливаю другую версию pyenv (например, 3.6.5) с помощью pyenv-mode, она правильно активирует эту среду, но по-прежнему оставляет строку режима, показывающую Python 2.7.14, а также правильную версию pyenv. Поскольку он работает правильно, это нормально - только немного сбивает с толку.

Спасибо, что исправили!

Привет, я недавно установил doom-emacs (от neovim), так что извините за незнание Emacs в целом.

Я пытаюсь заставить свой проект (на Python) правильно определять мою среду pipenv.

Я заметил, что вы упомянули, что:

  • pyenv: pyenv-mode-set и pyenv-mode-unset
  • pyvenv: pyvenv-активировать и pyvenv-деактивировать
  • conda: conda-env-activate и conda-env-deactivate

Но как насчет pipenv ? Когда я запустил :pipenv-activate , я получил только следующий результат:

Finished pipenv --venv

Когда я пытаюсь посмотреть определение кода (через компакт-диск SPC), оно все равно ничего не говорит: «Определений не найдено».

Я что-нибудь пропустил?

Благодарю.

Единственное, что я мог бы заставить работать, это если бы я запустил:

: pythonic-activate RET / путь / к / virtualenv / RET

Однако это весьма раздражает пользователей pipenv, поскольку путь для virtualenv в pipenv обычно находится в другом каталоге, чем сам проект.

@rezmuh Вы M-x pipenv-activate ? Потому что :pipenv не настоящая ex-команда (она может работать, но не так, как вы думаете).

@hlissner Я пробовал несколько способов.

Сначала я сделал это только с помощью :pipenv-activate затем сделал это с помощью M-x pipenv-activate а также SPC : pipenv-activate

Но результат был таким же: Finished pipenv --venv как показано ниже:

2018-08-12_599x157

Тогда определения кода еще не были доступны

@hlissner python-mode, похоже, не работает, если я не установлю общесистемный python3, я использую pyenv, и он не обнаруживает и не активирует python-mode, пока я не установлю python3. У меня есть python3 на pyenv, и это глобальная версия, установленная для моей учетной записи. Я не уверен, что это ошибка или просто случайность из-за моей плохой конфигурации.

Перед установкой: python3

screen shot 2018-08-13 at 08 18 59

После установки: python3 brew install python3

screen shot 2018-08-13 at 11 17 05

@georgreen Не могли бы вы проверить свои * Сообщения * на наличие сообщений об ошибках или предупреждениях (вы можете открыть их с помощью SPC h e ) при открытии режима python без установленного python3?

@hlissner

По какой-то причине эта комбинация клавиш не работает, но я видел сообщение с жалобой на то, что pipenv не найден на моем пути. Однако он доступен в моей прокладке python3.

screen shot 2018-08-13 at 20 25 07

spc h m хотя работаю

screen shot 2018-08-14 at 19 24 36

pipenv и питон

screen shot 2018-08-13 at 20 30 38

Когда я пытаюсь переключить его вручную с помощью m-x python-mode появляется pipenv not found on your path .

В некоторых проектах python-mode просто не загружается.

screen shot 2018-08-14 at 12 43 24

Я подозреваю, что вам нужно добавить ~ / .pyenv / shims к вашему PATH в вашем файле ~ / .profile.

export PATH=~/.pyenv/shims:$PATH

@rphillips на моем пути это уже есть.

@hlissner Запуск emacs через терминал с включенным виртуальным env, похоже, решает эту проблему.
screen shot 2018-08-14 at 19 16 42

screen shot 2018-08-14 at 19 16 32

Из этого, я думаю, можно сделать вывод, что это проблема пути.

@hlissner Исправлено: sweat_smile :, отбросьте все мои опасения. Я обнаружил, что проблема связана с тем, как ZSH загружал мои переменные env. Все, что мне нужно было сделать, это правильно загрузить их через .profil или .zshenv в этом случае, все работает как надо. Я думаю, что это применимо к остальной части потока, если ваш путь установлен, используйте .bash_profile , .profile или .zshenv чтобы emacs мог выбрать правильный путь (у меня был свой env в zshrc который, кажется, является причиной всего этого неожиданного поведения). Если вы не готовы к этому, запустите свой emacs с терминала, т.е. emacs .

@georgreen Нет проблем! Ты прав. .zshrc читается только в интерактивных сеансах zsh, а .zshenv читается во всех сеансах, интерактивных или иных. При запуске Emacs с графическим интерфейсом пользователя в MacOS, Doom открывает неинтерактивную оболочку для очистки среды оболочки (для копирования в Emacs). Это правильное поведение, хотя и часто вызывает путаницу.

Однако, когда я устанавливаю другую версию pyenv (например, 3.6.5) с помощью pyenv-mode, она правильно активирует эту среду, но по-прежнему оставляет строку режима, показывающую Python 2.7.14, а также правильную версию pyenv.

@bsag Случайно, это проект pipenv? Ваша версия в модельной строке должна уважать питонов, установленных pyenv, но сначала проконсультируется с pipenv, если текущий буфер является проектом pipenv.

Кроме того, какая у вас ОС? Если вы работаете в Linux, как запустить Emacs?

@hlissner Нет, у меня не установлен pipenv. Однако похоже, что у меня может быть та же проблема, что и у @georgreen, в том, что я не устанавливаю переменные env в нужном месте. Я исправлю это. На самом деле это очень полезная вещь для изучения, так что спасибо!

Итак, вот небольшая загадка. Надеюсь, это легко исправить.

Я сделал новую установку os X Mojave только потому, что установил python3 через pyenv и pyenv через homebrew. Я выполнил очень полезные инструкции в этой теме, чтобы DOOM распознал python 3. Я поместил соответствующие строки в файл .zshenv, чтобы DOOM подобрал его, и у меня был правильный путь с прокладками pyenv впереди.

screenshot 2019-02-27 22 34 44

Вот мой файл .zshenv
screenshot 2019-02-27 22 36 00

Какое-то время все шло отлично, пока я не начал новый проект. Конечно, я не могу сказать, что запуск нового проекта создал эту проблему, но я также не могу придумать ничего, что изменилось бы. Теперь, когда я открываю файл python, я получаю системный python версии 2.7.10 по умолчанию, показанный здесь:

screenshot 2019-02-27 22 39 08

Как видите, у меня установлена ​​только последняя версия Python3 через pyenv.
screenshot 2019-02-27 22 38 00

Если у кого-то есть предложения, буду очень признателен!

аналогичная проблема человеку выше. После активации pipenv запускает нужную версию интерпретатора. Однако по какой-то причине простой запуск SPC-: run-python дает мне 2.7.15.
в основном pyenv global не соблюдается.

Я рад предоставить дополнительную информацию о моей настройке, если это необходимо.

@finnkauski Я решил проблему, следуя приведенным здесь инструкциям.

Я просто поместил следующую строку в файл ~ / .doom.d / config.el

(setq python-shell-interpreter "python3" flycheck-python-pycompile-executable "python3")

Надеюсь, это поможет!

Привет,

Я использую doom-emacs (от гибрида Spacemacs) на Buster. В моем сеансе есть правильный PATH и многое другое с использованием переменных среды systemd. Я использую pyenv и стихи. Я использовал мост с Emacs, помещая VIRTUAL_ENV в файл .venv и версию pyenv в файл .python-version . Собственно, это указывает на то же самое, поскольку venv находится в версиях pyenv. В doom-emacs похоже, что ни один из них не читается, doom-emacs продолжает использовать системный python3 (3.7.3), а системное значение по умолчанию - 2.7.16.

Мой .doom.d / init.el:

       (python
        +pyenv)          ; beautiful is better than ugly

Любая подсказка, чтобы Doom назначал версию python в соответствии с версией pyenv?

С Уважением,

Запуск :!pyenv version возвращает правильное значение.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги