Оба Python 2 и 3 в Emacs - PullRequest
       28

Оба Python 2 и 3 в Emacs

17 голосов
/ 02 февраля 2009

Я использую 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.

Ответы [ 5 ]

10 голосов
/ 02 февраля 2009

Если вы используете python-mode.el, вы можете попробовать изменить py-which-shell. Для того, чтобы сделать это для каждого файла, вы можете поставить

# -*- py-which-shell: "python3"; -*-

в первой строке вашего файла - или во второй строке, если первая строка начинается с #!. Другой выбор - поставить

# Local Variables:
# py-which-shell: "python3" 
# End: 

в конце вашего файла. Возможно, вам следует указать полный путь к python3 вместо просто «python3».

4 голосов
/ 02 февраля 2009

Ответ - да. Если вы можете отличить 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 голосов
/ 22 сентября 2009

Мой комментарий на этот ответ .

Я написал /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)

Обратите внимание, что шебанг указывает на python3 и локальную переменную файла py-python-command.

Я также написал /t/min-py.el, который гарантирует, что вместо python.el используется python-mode.el (версия 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.

2 голосов
/ 15 мая 2011

относительно комментария 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 один раз. Это не должно быть проблемой, если вы не измените свой файл в том же буфере туда и обратно.

1 голос
/ 26 июля 2012

С током python-mode.el Шебанг почитается.

Интерактивно откройте оболочку Python просто с помощью

M-x pythonVERSION    
M-x python

вызовет установленный по умолчанию.

http://launchpad.net/python-mode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...