Подтвердить что ты не робот

Оба 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.

4b9b3361

Ответ 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