2014-05-14 4 views
7

Я кодирую python в emacs. Однако, как-то интерпретатор python, работающий в emacs, меня удивляет.Python в emacs: __name__ == '__main__', но почему-то не

Если я пишу

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

в буфере Emacs, и сказать Emacs, чтобы запустить интерпретатор и запустить содержимое этого буфера, я получаю буфер, содержащий

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

(оба __main__ и True - это выходы из инструкции print, буфер python всегда отображает >>> и печатает сразу после него. Я знаю об этом, это не проблема.)

Из командной строки оба python и python -i показывают «действительно», как и ожидалось.

Как Emacs способен к несогласованности в оценке __name__=='__main__' до True, но не выполняет вещи внутри if __name__ == '__main__':? И как перенастроить его, чтобы он больше не делал этого?

+0

@MartijnPieters: это печать строки '«__main __»' 'как __main__' ... – geoffspear

+0

@Wooble: ах, буфер Emacs выполнил код прямо в интерактивном приглашении. Попался. –

+4

Это, похоже, ошибка в более старых версиях elpy: https://github.com/jorgenschaefer/elpy/issues/69 (или, если вы не используете elpy, это «полезная функция» python.el.) – geoffspear

ответ

4

Как @Wooble mentioned in the comment, это может быть python.el вопроса: C-c C-c работает
python-shell-send-buffer функции:

питон-оболочка отправить-буфер представляет собой интерактивный скомпилирован Lisp функция `python.el».

(питон-оболочка отправить-буфер & опционально ARG)

Отправить весь буфер для нижнего процесса Python. С приставкой ARG разрешить выполнение кода внутри блоков, разделённых "if __name__=='__main__':"

т.е. для печати «на самом деле», добавьте префикс C-u C-c C-c.

Q: Я пытался прорыть python.el, и я до сих пор не знаю, как и где он это делает. Можете ли вы объяснить, так что я могу изменить поведение по умолчанию?

Чтобы узнать, что делает C-c C-c в вашем случае открыть файл питона и тип M-x describe-key RET с последующим C-c C-c (на самом деле нажать клавиши). По умолчанию он выполняет функцию python-shell-send-buffer в python.el.Вы можете переопределить клавиши для вызова функции с аргументом, так что C-c C-c будет вести себя как C-u C-c C-c, что позволяет работает "if __name__=='__main__':" части:

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

Я попытался прорваться через 'python.el', и я до сих пор не знаю, как и где он это делает. Можете ли вы объяснить, так что я могу изменить поведение по умолчанию? – Anaphory

0

После того, как вы запустили оболочку Python, вы можете просто переопределить переменную:

__name__ = 'repl' 

Это предотвращает if __name__=='__main__': блоки от запуска на любых последующих C-c C-c вызовов.

+0

Проблема в обратном: python в emacs * не * запускает «основные» блоки из 'C-c C-c'. Мне было бы хорошо, если бы он переписывал '__name__' внутренне, но, видимо, это не так, как видно из вывода. Эта непрозрачность меня смущает. – Anaphory

+0

@Anaphory: О! Должно быть, спал при чтении вопроса. – progo

Смежные вопросы