2009-02-01 8 views
17

J'ai utilisé Emacs pour écrire du code Python 2. Maintenant, j'ai deux Python 2.6 et 3.0 installés sur mon système, et j'ai besoin d'écrire du code Python 3 aussi.Python 2 et 3 dans Emacs

Voici comment les différentes versions sont mises en place dans/usr/bin:

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

python3 -> python3.0* 
python3.0* 

Est-il possible de le mettre en place pour que Emacs utilise la version correcte de Python, selon la langue que je suis en utilisant? Par exemple, C-c C-c exécute actuellement le tampon, mais il appelle toujours python2.6, même si j'écris du code Python 3.

+1

Vous vous demandez comment obtenir Emacs pour détecter automatiquement si vous écrivez du code Python 2 ou un code Python 3, et d'appeler la version Python correcte? Ou demandez-vous comment changer Emacs pour qu'il appelle une commande différente (par exemple python3) dans tous les cas où le code Python est chargé dans le tampon? –

+0

Évidemment, le premier serait idéal, mais cela semble assez difficile, car les différences syntaxiques entre Python 2 et Python 3 sont mineures. Il semble que les réponses à cette question prennent en compte le deuxième cas. Merci de clarifier. –

Répondre

4

La réponse est oui. Si vous pouvez distinguer Python 2 de Python 3, alors c'est un simple sujet de programmation pour qu'emacs fasse ce que vous voulez.

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

Tout ce qui reste à faire est de mettre en œuvre is-python3-p et run-python3 (etc.)

10

Si vous utilisez python-mode.el vous pouvez essayer de changer py-which-shell. Pour ce faire, sur une base par fichier que vous pouvez mettre

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

à la première ligne de votre fichier - ou à la deuxième ligne si la première ligne commence par #!. Un autre choix est de mettre

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

à la fin de votre fichier. Peut-être devriez-vous donner le chemin complet de python3 au lieu de simplement "python3".

+0

La variable locale de fichier ne fonctionne pas pour moi. Il semble que la commande py-python devrait être définie avec setq dans dotemacs pour prendre effet. Je développerai dans mon autre réponse à la question originale. – Yoo

+0

J'avais suggéré de paramétrer py-python-command mais python-mode.el utilise en interne py-which-shell et positionne py-which-shell à la valeur de py-python-command * avant * de voir la valeur locale du fichier. J'ai édité la réponse pour suggérer de changer directement py-which-shell. – cefstat

+0

Je suppose que cela serait plus utile pour 'C-h i g (emacs) Directory Variables' que pour' (emacs) File Variables' – phils

3

Mon commentaire sur this answer.

j'ai écrit /t/min.py qui fonctionnera bien dans python3 mais pas dans python2 (fonctionne la compréhension dans le dictionnaire python3)

Contenu de /t/min.py

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

Notez que le shebang indique python3 et la variable locale de fichier py-python-command aussi.

J'ai également écrit /t/min-py.el qui s'assure que python-mode.el (ver 5.1.0) est utilisé à la place de python.el.

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

Notez que la dernière ligne est commentée.

Je commence emacs avec la commande suivante:

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

emacs maintenant est démarré avec mes dotemacs alternatives /t/min-py.el et il ouvre /t/min.py.

Lorsque j'appuie sur C-c C-c pour envoyer le buffer à python, il dit que la partie "for" est fausse et cela indique que python2 est utilisé à la place de python3. Quand j'appuie sur C-c! pour démarrer l'interpréteur python, il est dit que python 2.5 est démarré.

Je peux même changer la deuxième ligne de/t/min.py à ceci:

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

et de refaire cette expérience et emacs utilise encore python2.

Si la dernière ligne de /t/min-py.el n'est pas commentée, alors C-c C-c et C-c! Les deux utilisent python3.

+0

Il semble que vos variables locales ne sont pas évaluées. Voyez-vous le message demandant une confirmation avant l'évaluation? sinon quelle est la valeur de 'enable-local-variables', si ce n'est pas' t' vos variables locales sont ignorées! – marcz

2

en ce qui concerne le commentaire 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)) 

Cela appellera python3 si "python3" est dans la ligne supérieure de votre tampon (tralala, en général). Pour une raison quelconque, le (setq py-pyton-command ...) ne vous permet pas de changer les versions une fois que vous avez exécuté py-execute-buffer une fois. Cela ne devrait pas être un problème, sauf si vous changez votre fichier sur le même tampon avant et en arrière.

1

Avec le courant python-mode.el shebang est honoré.

ouvrir interactivement un shell Python juste avec

M-x pythonVERSION  
M-x python 

appellera la valeur par défaut installé.

http://launchpad.net/python-mode