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