2014-05-14 57 views
7

我在emacs編碼python。然而,不知何故,運行在emacs上的python解釋器讓我感到吃驚。在Emacs的Python:__name__ =='__main__',但不知何故

如果我寫

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是打印語句的輸出; python緩衝區總是顯示>>>並在它之後立即打印。我意識到這一點,這不是問題。)

從命令行,pythonpython -i都如預期的那樣顯示「確實」。

Emacs如何能夠評估__name__=='__main__'True的不一致性,而不執行if __name__ == '__main__':內部的東西? 如何重新配置​​它,使其不再這樣做?

+0

@MartijnPieters:它的打印字符串'「__main __」''爲... __main__' – geoffspear

+0

@Wooble:啊,Emacs緩衝區直接在交互式提示符下執行代碼。疑難雜症。 –

+4

這似乎是舊版本的elpy中的一個錯誤:https://github.com/jorgenschaefer/elpy/issues/69(或者,如果您不使用elpy,它是python.el的「有用功能」。 ) – geoffspear

回答

4

由於@Wooble mentioned in the comment,它可能是python.el問題:C-c C-c運行
python-shell-send-buffer功能:

蟒蛇殼發送緩衝區是 `python.el互動編譯Lisp函數」。

(蟒殼發送緩衝器&可選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會表現等等,能運行"if __name__=='__main__':"部分C-u 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.el',我仍然不確定如何以及它在哪裏做到這一點。你能解釋一下,所以我可以修改默認行爲嗎? – Anaphory

0

一旦你開始了Python的外殼,你可以簡單地覆蓋變量:

__name__ = 'repl' 

這可以防止任何if __name__=='__main__':阻止任何後續的C-c C-c調用運行。

+0

問題是相反的:emacs *中的python不會從'C-c C-c'運行「main」塊。我甚至可以在內部覆蓋'__name__',但顯然這並不是如何發生的,從輸出中可以看出。這種透明度讓我感到困惑。 – Anaphory

+0

@Anaphory:哦!閱讀問題時一定是睡着了。 – progo

相關問題