Python中name=main:emacs中的Python:__name__= = '__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 缓冲区始终显示>>>并在其之后立即打印。我知道这一点,这不是问题。)

在命令行中,pythonpython -i都按预期显示“确实”。

Emacs 如何能够评估__name__=='__main__'True的不一致,而不执行if __name__ == '__main__':里面的东西?

8

作为@Wooble mentioned in the comment,它可能是python.el问题:C-c C-c运行
python-shell-send-buffer功能:

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

(python-shell-send-buffer & amp;可选的 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

;; 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 shell,你可以简单地覆盖变量:

__name__ = 'repl' 

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

0

此“功能”永不过时。请尝试使用

__name__=='__main__':

在 opperator 之间没有空格。

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(632)
Python可以编译吗:是否可以导入编译的python文件
上一篇
黑马数据库:将本地数据库数据同步到远程数据库
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(87条)