Emacs中的Python 2和3

时间:2009-02-01 21:32:47

标签: python emacs python-3.x

我一直在使用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 个答案:

答案 0 :(得分:10)

如果您使用的是python-mode.el,可以尝试更改py-which-shell。为了在每个文件的基础上执行此操作,您可以添加

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

位于文件的第一行 - 如果第一行以#!开头,则位于第二行。 另一个选择是

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

在您的文件的末尾。也许你应该给python3的完整路径而不仅仅是“python3”。

答案 1 :(得分:4)

答案是肯定的。如果你可以将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-prun-python3(等等)

答案 2 :(得分:3)

我对this answer的评论。

我写了/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-command。

我还写了/t/min-py.el,它确保使用python-mode.el(ver 5.1.0)而不是python.el。

/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”部分是错误的,这表明正在使用python2而不是python3。当我按下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。

答案 3 :(得分:2)

关于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”位于缓冲区的顶行(通常是shebang),这将调用python3。出于某种原因,(setq py-pyton-command ...)一旦您运行py-execute-buffer一次就不允许您更改版本。除非您来回更改同一缓冲区上的文件,否则这不应成为问题。

答案 4 :(得分:1)

目前python-mode.el shebang很荣幸。

使用

以交互方式打开Python shell
M-x pythonVERSION    
M-x python

将调用已安装的默认值。

http://launchpad.net/python-mode