Python 2 y 3 en Emacs

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

Aquí es cómo se configuran las diferentes versiones en / usr / bin:

python -> python2.6* python2 -> python2.6* python2.6* python3 -> python3.0* python3.0* 

¿Hay alguna forma de configurarlo para que Emacs use la versión correcta de Python, dependiendo del idioma que esté usando? Por ejemplo, Cc Cc actualmente ejecuta el búfer, pero siempre llama a python2.6, incluso si estoy escribiendo el código de Python 3.

Si está usando python-mode.el puede intentar cambiar py-which-shell . Para hacer esto en una base por archivo puede poner

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

en la primera línea de su 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ía dar el camino completo a python3 en lugar de solo “python3”.

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

 (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 "Cc Cc") #'run-python) 

Todo lo que queda por hacer es implementar is-python3-p y run-python3 (etc.)

Mi comentario sobre esta respuesta .

Escribí /t/min.py que funcionará bien en python3 pero no en python2 (la comprensión del diccionario funciona en python3)

Contenidos 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 comando shebang indica python3 y la variable local del archivo py-python-command también.

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

Contenidos 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") 

Tenga en cuenta que la última línea está comentada.

Comienzo emacs con el siguiente comando:

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

Ahora emacs se inicia con mis puntos alternativos /t/min-py.el y abre /t/min.py.

Cuando presiono Cc Cc para enviar el búfer a python, dice que la parte “for” está equivocada y eso indica que se está usando python2 en lugar de python3. Cuando presiono Cc! para iniciar el intérprete de python, se 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 vuelve a hacer este experimento y emacs todavía usa python2.

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

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

Esto llamará a python3 si “python3” está en la línea superior de tu búfer (shebang, generalmente). Por alguna razón, el (setq py-pyton-command ...) no te permite cambiar las versiones una vez que has 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 un lado a otro.

Con el actual python-mode.el shebang se python-mode.el .

Abre interactivamente un shell de Python solo con

 Mx pythonVERSION Mx python 

llamará el predeterminado instalado.

http://launchpad.net/python-mode