繁体   English   中英

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

[英]Python in emacs: __name__ == '__main__', but somehow not

我在 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 缓冲区总是显示>>>并在它之后立即打印。我知道这一点,这不是问题。)

从命令行, pythonpython -i都显示“确实”,正如预期的那样。

Emacs 如何能够评估__name__=='__main__'True的不一致,而不执行内部的事情if __name__ == '__main__': 以及如何重新配置它使其不再这样做?

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

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

(python-shell-send-buffer&optional ARG)

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

即,要打印“确实”,添加前缀Cu Cc Cc

问:我试图通过python.el挖掘,我仍然不确定它是如何做到这一点的。 你能解释一下,所以我可以修改默认行为吗?

要找出Cc Cc在您的情况下执行的操作,请打开python文件并键入Mx describe-key RET然后键入Cc Cc (实际按键)。 默认情况下,它在python.el运行python-shell-send-buffer函数。 您可以重新定义键以使用参数调用函数,以便Cc Cc行为类似于Cu Cc Cc ,它可以运行"if __name__=='__main__':" part:

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

一旦启动了python shell,就可以简单地覆盖变量:

__name__ = 'repl' 

这可以防止任何if __name__=='__main__':块在任何后续的Cc Cc调用上运行。

这个“功能”永远不会过时。 尝试使用

__name__=='__main__':

运算符之间没有空格。

那么 python.el 将不会绕过它。 所以看看你的代码格式化程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM