Во-первых, мне очень нравится 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.
Нажмите, чтобы развернуть
- 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/)
```
Благодаря!
Если вы запустите 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 находится в вашем PATH
(и exec-path
, по расширению), +python-current-version
должен содержать текущую версию. Пожалуйста, обновите и дайте мне знать, если это так.
Привет, Хлисснер, спасибо за обновление.
После обновления он по-прежнему работает не так, как ожидалось, и у меня
Его значение - 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-mode-set
и pyenv-mode-unset
pyvenv-activate
и pyvenv-deactivate
conda-env-activate
и conda-env-deactivate
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.
Я заметил, что вы упомянули, что:
Но как насчет 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
как показано ниже:
Тогда определения кода еще не были доступны
@hlissner python-mode, похоже, не работает, если я не установлю общесистемный python3, я использую pyenv, и он не обнаруживает и не активирует python-mode, пока я не установлю python3. У меня есть python3 на pyenv, и это глобальная версия, установленная для моей учетной записи. Я не уверен, что это ошибка или просто случайность из-за моей плохой конфигурации.
Перед установкой: python3
После установки: python3 brew install python3
@georgreen Не могли бы вы проверить свои * Сообщения * на наличие сообщений об ошибках или предупреждениях (вы можете открыть их с помощью SPC h e
) при открытии режима python без установленного python3?
@hlissner
По какой-то причине эта комбинация клавиш не работает, но я видел сообщение с жалобой на то, что pipenv не найден на моем пути. Однако он доступен в моей прокладке python3.
spc h m
хотя работаю
pipenv и питон
Когда я пытаюсь переключить его вручную с помощью m-x python-mode
появляется pipenv not found on your path
.
В некоторых проектах python-mode просто не загружается.
Я подозреваю, что вам нужно добавить ~ / .pyenv / shims к вашему PATH в вашем файле ~ / .profile.
export PATH=~/.pyenv/shims:$PATH
@rphillips на моем пути это уже есть.
@hlissner Запуск emacs через терминал с включенным виртуальным env, похоже, решает эту проблему.
Из этого, я думаю, можно сделать вывод, что это проблема пути.
@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 впереди.
Вот мой файл .zshenv
Какое-то время все шло отлично, пока я не начал новый проект. Конечно, я не могу сказать, что запуск нового проекта создал эту проблему, но я также не могу придумать ничего, что изменилось бы. Теперь, когда я открываю файл python, я получаю системный python версии 2.7.10 по умолчанию, показанный здесь:
Как видите, у меня установлена только последняя версия Python3 через pyenv.
Если у кого-то есть предложения, буду очень признателен!
аналогичная проблема человеку выше. После активации 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
возвращает правильное значение.
Самый полезный комментарий
Я подозреваю, что вам нужно добавить ~ / .pyenv / shims к вашему PATH в вашем файле ~ / .profile.