I am coding python in emacs. However, somehow the python interpreter running in emacs manages to surprise me.
If I write
print()
print(__name__)
print(__name__=='__main__')
if __name__ == '__main__':
print("indeed")
in an emacs buffer, and tell emacs to start an interpreter and run the content of this buffer, I get a buffer containing
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
>>>
(Both __main__
and True
are the outputs from the print statement; the python buffer always displays the >>>
and prints immediately after it. I am aware of this, this is not a problem.)
From the command line, both python
and python -i
show the 'indeed', as expected.
How is Emacs able to the inconsistency of evaluating __name__=='__main__'
to True
, while not executing things inside if __name__ == '__main__':
?
And how do reconfigure it so it does not do so any more?
As @Wooble mentioned in the comment, it might be python.el
issue: C-c C-c
runspython-shell-send-buffer
function:
python-shell-send-buffer is an interactive compiled Lisp function in `python.el'.
(python-shell-send-buffer &optional ARG)
Send the entire buffer to inferior Python process. With prefix ARG allow execution of code inside blocks delimited by
"if __name__=='__main__':"
i.e., to print "indeed", add prefix C-u C-c C-c
.
Q: I have tried to dig through python.el, and I am still not sure how and where it does this. Can you explain, so I can modify the default behaviour?
To find out what C-c C-c
does in your case open a python file and type M-x describe-key RET
followed by C-c C-c
(actually press the keys). By default it runs python-shell-send-buffer
function in python.el
. You could redefine the keys to call the function with an argument so that C-c C-c
would behave like C-u C-c C-c
that enables running "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)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With