2009-02-01 11 views
17

He estado usando Emacs para escribir el código de Python 2. Ahora tengo instalados tanto Python 2.6 como 3.0 en mi sistema, y ​​también tengo que escribir el código de Python 3.Ambos Python 2 y 3 en Emacs

Así es como las diferentes versiones se instalan en/usr/bin:

python -> python2.6* 
python2 -> python2.6* 
python2.6* 

python3 -> python3.0* 
python3.0* 

¿Hay alguna manera de configurar esto para que Emacs usa la versión correcta de Python, en función del idioma que soy ¿utilizando? Por ejemplo, C-c C-c actualmente ejecuta el búfer, pero siempre llama a python2.6, incluso si estoy escribiendo el código de Python 3.

+1

Se está preguntando cómo conseguir Emacs para detectar automáticamente si está escribiendo código Python 2 o Python 3 Código, y para llamar a la versión de Python correcta? ¿O está preguntando cómo cambiar Emacs para que llame a un comando diferente (es decir, python3) en todos los casos cuando el código de Python se carga en el búfer? –

+0

Obviamente, el primero sería ideal, pero parece bastante difícil, ya que las diferencias sintácticas entre Python 2 y Python 3 son menores. Parece que las respuestas a esta pregunta se ocupan del segundo caso. Gracias por aclararlo. –

Respuesta

4

La respuesta es sí. Si puede distinguir Python 2 de Python 3, entonces es una cuestión de programación simple hacer que emacs haga lo que quiera.

(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) 

Todo lo que queda por hacer es poner en práctica is-python3-p y run-python3 (etc.)

10

Si está utilizando python-mode.el se puede tratar de cambiar py-which-shell. Con el fin de hacer esto en función de cada archivo se puede poner

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

en la primera línea del archivo - o en la segunda línea si la primera línea comienza con #!. Otra opción es poner

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

al final de su archivo. Tal vez deberías dar la ruta completa a python3 en lugar de simplemente a "python3".

+0

La variable local del archivo no funciona para mí. Parece que py-python-command se debe establecer con setq en dotemacs para que tenga efecto. Elaboraré en mi otra respuesta a la pregunta original. – Yoo

+0

He sugerido establecer py-python-command, pero python-mode.el utiliza internamente py-wh-shell y establece py-which-shell en el valor de py-python-command * before * ve el valor de archivo local. He editado la respuesta para sugerir cambiar directamente py-which-shell. – cefstat

+0

Sospecho que esto sería más útil para 'C-h i g (emacs) Variables de directorio' que para '(emacs) Variables de archivo ' – phils

3

Mi comentario sobre this answer.

escribí /t/min.py que se desarrollará bien en python3 pero no en python2 (diccionario por comprensión trabaja en python3)

Contenido de /t/min.py

#!/usr/bin/python3 
# -*- py-python-command: "/usr/bin/python3"; -*- 
a = {i:i**2 for i in range(10)} 
print(a) 

Tenga en cuenta que el shebang indica python3 y la variable local de archivo py-python-command también.

También escribí /t/min-py.el que asegura que python-mode.el (ver 5.1.0) se usa en lugar de python.el.

Contenido de /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") 

nota de que la última línea se comenta.

que inicie Emacs con el comando siguiente:

emacs -Q -l /t/min-py.el /t/min.py & 

Ahora Emacs se inicia con mis dotemacs alternos /t/min-py.el y se abre /t/min.py.

Cuando presiono C-c C-c para enviar el búfer a python, dice que la parte "para" es incorrecta y eso indica que se está utilizando python2 en lugar de python3. Cuando presiono C-c! para iniciar el intérprete de python, dice que se inició python 2.5.

Incluso puedo cambiar la segunda línea de/t/min.py a esto:

# -*- py-python-command: "chunkybacon"; -*- 

y hacer este experimento de nuevo y emacs todavía usa python2.

Si la última línea de /t/min-py.el no está comentada, entonces C-c C-c y C-c! ambos usan python3.

+0

Parece que sus variables locales no se evalúan. ¿Ves el mensaje pidiendo confirmación antes de la evaluación? de lo contrario, ¿cuál es el valor de 'enable-local-variables', si no es' t' se ignoran sus variables locales! – marcz

2

Con respecto al comentario de 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)) 

Para ello, será python3 si "python3" está en la línea superior de la memoria intermedia (tinglado, por lo general). Por algún motivo, el (setq py-pyton-command ...) no le permite cambiar las versiones una vez que haya ejecutado py-execute-buffer una vez. Eso no debería ser un problema a menos que cambie su archivo en el mismo búfer de ida y vuelta.

1

Con corriente python-mode.el shebang es un honor.

interactiva abrir un terminal de Python simplemente con

M-x pythonVERSION  
M-x python 

llamará al predeterminado instalado.

http://launchpad.net/python-mode