emacs中的Python:__name__ =='__ main__',但不知何故

Ana*_*ory 9 python emacs

我在emacs中编写python.然而,不知何故,在emacs中运行的python解释器设法让我感到惊讶.

如果我写

print()
print(__name__)
print(__name__=='__main__')
if __name__ == '__main__':
    print("indeed")
Run Code Online (Sandbox Code Playgroud)

在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
>>> 
Run Code Online (Sandbox Code Playgroud)

(两者__main__True与打印语句输出;蟒蛇缓冲总是显示>>>并打印后立即,我意识到了这一点,这不是一个问题.)

在命令行中,双方pythonpython -i显示"确实",符合市场预期.

如何Emacs的能够评价的不一致性__name__=='__main__'True,而不是在执行里面的东西if __name__ == '__main__':?如何重新配置​​它以便它不再这样做?

jfs*_*jfs 5

正如@Wooble在评论中提到的,它可能是python.el问题:C-c C-c运行
python-shell-send-buffer函数:

python-shell-send-buffer是python.el中的一个交互式编译的Lisp函数。

(python-shell-send-buffer和可选的ARG)

将整个缓冲区发送到劣质的Python进程。带有前缀ARG的代码允许在由分隔的块内执行代码"if __name__=='__main__':"

即,要打印“ indeed”,请添加prefix C-u C-c C-c

问:我试图通过python.el进行挖掘,但是我仍然不确定如何以及在何处执行此操作。您能解释一下,以便我修改默认行为吗?

要查明C-c C-c您的情况,请打开python文件并键入,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)))
Run Code Online (Sandbox Code Playgroud)