2014-05-14 3 views
7

Ich codiere Python in Emacs. Irgendwie schafft es der Python-Interpreter, der in Emacs läuft, mich zu überraschen.Python in Emacs: __name__ == '__main__', aber irgendwie nicht

Wenn ich

print() 
print(__name__) 
print(__name__=='__main__') 
if __name__ == '__main__': 
    print("indeed") 

in einem Emacs-Puffer zu schreiben, und Emacs sagen einen Dolmetscher zu starten und den Inhalt dieses Puffers laufen lasse, erhalte ich einen Puffer

Python 3.3.5 (default, Mar 18 2014, 02:00:02) 
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
__main__ 
True 
>>> 

(Both __main__ enthält, und True sind die Ausgaben von der print-Anweisung, der Python-Puffer zeigt immer die >>> an und druckt unmittelbar danach.Ich bin mir dessen bewusst, das ist kein Problem.)

Von der Befehlszeile aus zeigen sowohl python als auch python -i die 'in der Tat', wie erwartet.

Wie ist Emacs in der Lage zu der Inkonsistenz der Auswertung zu True, während nicht Dinge innerhalb if __name__ == '__main__': ausführen? Und wie neu konfigurieren, so dass es nicht mehr tut?

+0

@MartijnPieters: es ist das Drucken der Zeichenkette '„__main __“' als '__main__' ... – geoffspear

+0

@Wooble: Ach, der Emacs-Puffer führte den Code direkt in einer interaktiven Eingabeaufforderung aus. Erwischt. –

+4

Dies scheint ein Fehler in älteren Versionen von elpy zu sein: https://github.com/jorgenschaefer/elpy/issues/69 (oder, wenn du nicht elpy verwendest, ist es ein "hilfreiches Feature" von python.el.) – geoffspear

Antwort

4

Als @Wooble mentioned in the comment, könnte es python.el Problem sein: C-c C-c läuft
python-shell-send-buffer Funktion:

Python-Shell-send-Puffer ist eine interaktive kompilierte Lisp-Funktion in `python.el‘.

(Python-shell-send-Puffer & optional ARG)

sendet den gesamten Puffer zu inferior Python Prozess. Mit Präfix ARG ermöglichen die Ausführung von Code in Blöcken von "if __name__=='__main__':" begrenzt

d.h. drucken "ja", fügt prefix C-u C-c C-c.

F: Ich habe versucht, durch python.el zu graben, und ich bin immer noch nicht sicher, wie und wo sie dies tun. Können Sie das erklären, damit ich das Standardverhalten ändern kann?

Um herauszufinden, was C-c C-c in Ihrem Fall tut M-x describe-key RET durch C-c C-c (eigentlich die Tasten drücken) folgte eine Python-Datei und die Art öffnen. Standardmäßig läuft python-shell-send-buffer Funktion in python.el.Sie könnten die Tasten neu definieren die Funktion mit einem Argument zu nennen, so dass C-c C-c wie C-u C-c C-c verhalten würde, die "if __name__=='__main__':" Teil ermöglicht ausgeführt wird:

;; Make C-c C-c behave like C-u C-c C-c in Python mode 
(require 'python) 
(define-key python-mode-map (kbd "C-c C-c") 
    (lambda() (interactive) (python-shell-send-buffer t))) 
+0

Ich habe versucht, durch 'python.el' zu graben, und ich bin mir immer noch nicht sicher, wie und wo es das tut. Können Sie das erklären, damit ich das Standardverhalten ändern kann? – Anaphory

0

Sobald Sie die Python-Shell gestartet haben, können Sie einfach die Variable außer Kraft setzen:

__name__ = 'repl' 

Dies verhindert, dass if __name__=='__main__': Blöcke von auf alle nachfolgenden C-c C-c Anrufungen läuft.

+0

Das Problem ist das Gegenteil: Python in Emacs * führt nicht die "Haupt" -Blöcke von "C-c C-c". Ich wäre sogar in Ordnung, wenn ich "__name__" intern überschreiben würde, aber anscheinend geschieht das nicht so, wie aus der Ausgabe hervorgeht. Diese Intransparenz verwirrt mich. – Anaphory

+0

@Anaphory: oh! Ich muss geschlafen haben, als ich die Frage gelesen habe. – progo

Verwandte Themen