17 Stimmen

Sowohl Python 2 als auch 3 in Emacs

Ich habe Emacs verwendet, um Python 2 Code zu schreiben. Jetzt habe ich sowohl Python 2.6 und 3.0 auf meinem System installiert, und ich muss Python 3 Code als auch zu schreiben.

So werden die verschiedenen Versionen in /usr/bin eingerichtet:

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

python3 -> python3.0*
python3.0*

Gibt es eine Möglichkeit, dies so einzurichten, dass Emacs die richtige Version von Python verwendet, je nachdem, welche Sprache ich verwende? Zum Beispiel führt C-c C-c derzeit den Puffer aus, aber es ruft immer Python2.6 auf, auch wenn ich Python-3-Code schreibe.

1 Stimmen

Fragen Sie sich, wie Sie Emacs dazu bringen können, automatisch zu erkennen, ob Sie Python-2-Code oder Python-3-Code schreiben, und die richtige Python-Version aufzurufen? Oder fragen Sie sich, wie Sie Emacs so ändern können, dass er in jedem Fall einen anderen Befehl (z. B. python3) aufruft, wenn Python-Code in den Puffer geladen wird?

0 Stimmen

Natürlich wäre das erste ideal, aber das scheint ziemlich schwierig zu sein, da die syntaktischen Unterschiede zwischen Python 2 und Python 3 gering sind. Es sieht so aus, als würden die Antworten auf diese Frage den zweiten Fall abdecken. Danke für die Klarstellung.

10voto

cefstat Punkte 2216

Wenn Sie python-mode.el verwenden, können Sie versuchen, die py-which-shell . Um dies für jede einzelne Datei zu tun, können Sie

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

in der ersten Zeile Ihrer Datei - oder in der zweiten Zeile, wenn die erste Zeile mit #! . Eine weitere Möglichkeit besteht darin, die

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

am Ende Ihrer Datei. Vielleicht sollten Sie den vollständigen Pfad zu python3 angeben, anstatt nur "python3".

0 Stimmen

Die lokale Dateivariable funktioniert bei mir nicht. Es scheint, dass der py-python-Befehl mit setq in dotemacs gesetzt werden sollte, um Wirkung zu zeigen. Ich werde in meiner anderen Antwort auf die ursprüngliche Frage näher darauf eingehen.

0 Stimmen

Ich hatte vorgeschlagen, py-python-command zu setzen, aber python-mode.el verwendet intern py-which-shell und setzt py-which-shell auf den Wert von py-python-command vor sieht er den dateilokalen Wert. Ich habe die Antwort bearbeitet und schlage vor, py-which-shell direkt zu ändern.

0 Stimmen

Ich vermute, dies wäre nützlicher für C-h i g (emacs) Directory Variables als für (emacs) File Variables

4voto

jrockway Punkte 40754

Die Antwort ist ja. Wenn Sie Python 2 von Python 3 unterscheiden können, dann ist es eine einfache Frage der Programmierung, emacs dazu zu bringen, das zu tun, was Sie wollen.

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

Alles, was noch zu tun ist, ist die Umsetzung is-python3-p et run-python3 (usw.)

3voto

Yoo Punkte 16264

Mein Kommentar zu diese Antwort .

Ich habe /t/min.py geschrieben, das in Python3 gut läuft, aber nicht in Python2 (Wörterbuchverstehen funktioniert in Python3)

Inhalt von /t/min.py

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

Beachten Sie, dass der shebang auf python3 und die lokale Variable py-python-command hinweist.

Ich habe auch /t/min-py.el geschrieben, das sicherstellt, dass python-mode.el (ver 5.1.0) anstelle von python.el verwendet wird.

Inhalt von /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")

Beachten Sie, dass die letzte Zeile auskommentiert ist.

Ich starte emacs mit dem folgenden Befehl:

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

Jetzt wird emacs mit meinem alternativen dotemacs /t/min-py.el gestartet und es öffnet /t/min.py.

Wenn ich C-c C-c drücke, um den Puffer an Python zu senden, sagt es, dass der "for"-Teil falsch ist und das bedeutet, dass Python2 statt Python3 verwendet wird. Wenn ich C-c ! drücke, um den Python-Interpreter zu starten, sagt er, dass Python 2.5 gestartet ist.

Ich kann sogar die zweite Zeile von /t/min.py wie folgt ändern:

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

und führe dieses Experiment erneut durch, und Emacs verwendet immer noch Python2.

Wenn die letzte Zeile von /t/min-py.el nicht auskommentiert ist, dann verwenden C-c C-c und C-c ! beide Python3.

0 Stimmen

Es scheint, dass Ihre lokalen Variablen nicht ausgewertet werden. Sehen Sie die Meldung, in der Sie vor der Auswertung um Bestätigung gebeten werden? enable-local-variables wenn sie es nicht ist t Ihre lokalen Variablen werden ignoriert!

2voto

Felipe Punkte 2831

Zum Kommentar von 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))

Dies führt zum Aufruf python3 wenn "python3" in der obersten Zeile Ihres Puffers steht (Shebang, normalerweise). Aus irgendeinem Grund wird die (setq py-pyton-command ...) lässt Sie die Version nicht mehr ändern, wenn Sie die py-execute-buffer einmal. Das sollte kein Problem sein, es sei denn, Sie ändern Ihre Datei auf demselben Puffer hin und her.

1voto

Andreas Röhler Punkte 4664

Mit aktuellen python-mode.el shebang wird geehrt.

Öffnen Sie eine Python-Shell interaktiv nur mit

M-x pythonVERSION    
M-x python

wird die installierte Standardeinstellung aufgerufen.

http://launchpad.net/python-mode

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X