Emacs 中的 Python:__name__ u003du003d '__main__',但不知何故没有
问题:Emacs 中的 Python:name u003du003d 'main',但不知何故没有
我在emacs中编码python。然而,不知何故,在 emacs 中运行的 python 解释器让我感到惊讶。
如果我写
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__':内部的事情?以及如何重新配置它使其不再这样做?
解答
正如@Wooble 在评论中提到的那样,它可能是python.el问题:C-c C-c运行
python-shell-send-buffer功能:
python-shell-send-buffer 是 `python.el' 中一个交互式编译的 Lisp 函数。
(python-shell-send-buffer &optional ARG)
将整个缓冲区发送到下级 Python 进程。带有前缀 ARG 允许在由
"if __name__=='__main__':"分隔的块内执行代码
即,要打印“确实”,请添加前缀C-u C-c C-c。
问: 我试图挖掘 python.el,但我仍然不确定它是如何以及在哪里执行此操作的。你能解释一下,所以我可以修改默认行为吗?
要了解C-c C-c在您的情况下做了什么,请打开一个 python 文件并键入M-x describe-key RET,然后键入C-c C-c(实际上是按键)。默认情况下,它在python.el中运行python-shell-send-buffer函数。您可以重新定义键以使用参数调用函数,以便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)