Оба Python 2 и 3 в Emacs
Я использую Emacs для написания кода Python 2. Теперь у меня есть оба Python 2.6 и 3.0, установленные в моей системе, и мне также нужно написать код Python 3.
Вот как настраиваются разные версии в /usr/bin:
python -> python2.6*
python2 -> python2.6*
python2.6*
python3 -> python3.0*
python3.0*
Есть ли способ установить это, чтобы Emacs использовала правильную версию Python, в зависимости от того, какой язык я использую? Например, C-c C-c в настоящее время запускает буфер, но он всегда вызывает python2.6, даже если я пишу код Python 3.
Ответы
Ответ 1
Если вы используете python-mode.el, вы можете попробовать изменить py-which-shell
. Чтобы сделать это для каждого файла, вы можете поместить
# -*- py-which-shell: "python3"; -*-
в первой строке вашего файла - или во второй строке, если первая строка начинается с #!
.
Другой выбор - поставить
# Local Variables:
# py-which-shell: "python3"
# End:
в конце вашего файла. Возможно, вы должны указать полный путь к python3, а не просто "python3".
Ответ 2
Ответ: да. Если вы можете отличить Python 2 от Python 3, то это простая задача программирования, чтобы заставить emacs делать то, что вы хотите.
(define run-python (&optional buffer)
(with-current-buffer (or buffer (current-buffer))
(if (is-python3-p)
(run-python3)
(run-python2))))
(define-key python-mode-map (kbd "C-c C-c") #'run-python)
Все, что осталось сделать, это реализовать is-python3-p
и run-python3
(и т.д.)
Ответ 3
Мой комментарий к этому ответу.
Я написал /t/min.py, который будет отлично работать в python3, но не в python2 (понимание словаря работает в python3)
Содержимое/t/min.py
#!/usr/bin/python3
# -*- py-python-command: "/usr/bin/python3"; -*-
a = {i:i**2 for i in range(10)}
print(a)
Обратите внимание, что shebang также указывает на python3 и локальную переменную py-python файла.
Я также написал /t/min -py.el, который гарантирует, что вместо python.el используется python-mode.el(ver 5.1.0).
Содержание/t/min-py.el
(add-to-list 'load-path "~/m/em/lisp/")
(autoload 'python-mode "python-mode" "Python Mode." t)
;; (setq py-python-command "python3")
Обратите внимание, что последняя строка закомментирована.
Я запускаю emacs со следующей командой:
emacs -Q -l /t/min-py.el /t/min.py &
Теперь emacs запускается с моими альтернативными dotemacs/t/min-py.el, и он открывает /t/min.py.
Когда я нажимаю C-c C-c для отправки буфера на python, он говорит, что часть "for" неверна и указывает, что вместо python3 используется python2. Когда я нажимаю C-c! для запуска интерпретатора python, он говорит, что запускается python 2.5.
Я могу изменить вторую строку /t/min.py на это:
# -*- py-python-command: "chunkybacon"; -*-
и повторите этот эксперимент, и emacs все еще использует python2.
Если последняя строка /t/min -py.el не закомментирована, то C-c C-c и C-c! оба используют python3.
Ответ 4
относительно комментария jrockway:
(defun is-python3-p () "Check whether we're running python 2 or 3."
(setq mystr (first (split-string (buffer-string) "\n" t)))
(with-temp-buffer
(insert mystr)
(goto-char 0)
(search-forward "python3" nil t)))
(defun run-python () "Call the python interpreter."
(interactive)
(if (is-python3-p)
(setq py-python-command "/usr/bin/python3")
(setq py-python-command "/usr/bin/python"))
(py-execute-buffer))
Это вызовет python3
, если "python3" находится в верхней строке вашего буфера (обычно shebang). По какой-то причине (setq py-pyton-command ...)
не позволяет изменять версии после запуска py-execute-buffer
один раз. Это не должно быть проблемой, если вы не измените свой файл в том же буфере взад и вперед.
Ответ 5
С текущим python-mode.el
shebang соблюдается.
Интерактивно откройте оболочку Python с помощью
M-x pythonVERSION
M-x python
вызовет установленный по умолчанию.
http://launchpad.net/python-mode