Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you run Python code using Emacs?

Tags:

python

emacs

I'm trying to run Python code for testing and debugging using Emacs. How should I debug and run code in *.py files ? I tried using the M-x compile commands . Using M-x compile, I get a compilation buffer that crashes (It says Python is compiling, but then nothing happens).

like image 351
quark Avatar asked Sep 04 '14 15:09

quark


Video Answer


2 Answers

If you are using emacs24 this should be the default (in emacs23 you need python.el, not python-mode.el):

In a python buffer:

  • C-c C-z : open a python shell
  • C-c C-c : run the content of the buffer in the opened python shell
  • C-c C-r : run the selected region in the python shell

default python shell is "python", if you need to use ipython you can use this conf in your .emacs

(setq
 python-shell-interpreter "ipython"
 python-shell-interpreter-args "--colors=Linux --profile=default"
 python-shell-prompt-regexp "In \\[[0-9]+\\]: "
 python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: "
 python-shell-completion-setup-code
 "from IPython.core.completerlib import module_completion"
 python-shell-completion-module-string-code
 "';'.join(module_completion('''%s'''))\n"
 python-shell-completion-string-code
 "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")

provided that you have ipython installed in your system of course :)

ipython>=5 has a auto-complete feature which breaks the emacs sub-shell, you can fix this by changing this line

python-shell-interpreter-args "--colors=Linux --profile=default"

and add --simple-prompt.

It will allow you to see ipython correctly but for some reason I did not get yet the auto-completion in emacs is not as effective as it used to be.

like image 128
Oberix Avatar answered Oct 16 '22 14:10

Oberix


How do you run Python code using Emacs?

I'm running Emacs 26, vanilla dev version (self compiled from source cloned from Savannah).

(Note that in emacs docs, we usually see, for example, Ctrl-c denoted as C-c)

In Python mode (which I usually enter by using C-x C-f to "find" a (possibly new) file ending in .py), you can start a Python shell with and then execute your buffer's
if __name__ == '__main__': with:

  • C-c C-p (which executes run-python to create a shell with Inferior Python major mode, Shell-Compile minor mode)

  • C-u C-c C-c (which executes python-shell-send-buffer with a prefix argument)

We require the prefix argument to send the if __name__ == '__main__': block to the inferior Python shell.

We can see all of the Ctrl-c commands with Ctrl-c ?

C-c C-c       python-shell-send-buffer
C-c C-d       python-describe-at-point
C-c C-f       python-eldoc-at-point
C-c C-j       imenu
C-c C-l       python-shell-send-file
C-c C-p       run-python
C-c C-r       python-shell-send-region
C-c C-s       python-shell-send-string
C-c C-t       Prefix Command
C-c C-v       python-check
C-c C-z       python-shell-switch-to-shell
C-c <     python-indent-shift-left
C-c >     python-indent-shift-right

C-c C-t c python-skeleton-class
C-c C-t d python-skeleton-def
C-c C-t f python-skeleton-for
C-c C-t i python-skeleton-if
C-c C-t m python-skeleton-import
C-c C-t t python-skeleton-try
C-c C-t w python-skeleton-while

Inspecting the help for python-shell-send-buffer (by clicking it), we see:

python-shell-send-buffer is an interactive compiled Lisp function in
‘python.el’.

(python-shell-send-buffer &optional SEND-MAIN MSG)

Send the entire buffer to inferior Python process.
When optional argument SEND-MAIN is non-nil, allow execution of
code inside blocks delimited by "if __name__== '__main__':".
When called interactively SEND-MAIN defaults to nil, unless it’s
called with prefix argument.  When optional argument MSG is
non-nil, forces display of a user-friendly message if there’s no
process running; defaults to t when called interactively.

According to the docs C-u is a prefix argument - and seems to be the most generic one.

A workaround that lets us avoid using the prefix argument C-u is using parentheses:

if (__name__ == '__main__'):
    main()

instead of the usual:

if __name__ == '__main__':
    main()

and then C-c C-c by itself executes the main function.

like image 28
Russia Must Remove Putin Avatar answered Oct 16 '22 14:10

Russia Must Remove Putin