Как запустить код Python с помощью Emacs?

Я пытаюсь запустить код Python для тестирования и отладки с помощью Emacs. Как мне отлаживать и запускать код в файлах *.py? Я попытался использовать команды M-x compile. Используя M-x compile, я получаю аварийный сигнал компиляции (он говорит, что Python компилируется, но потом ничего не происходит).

Ответ 1

Если вы используете emacs24, это должно быть по умолчанию (в emacs23 вам нужен python.el, а не python-mode.el):

В буфере python:

  • C-c C-z: открыть оболочку python
  • C-c C-c: запустить содержимое буфера в открытой оболочке python
  • C-c C-r: запустить выбранную область в оболочке python

default python shell - это "python", если вы используете ipython, вы можете использовать этот conf в своем .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")

при условии, что у вас есть ipython, установленный в вашей системе, конечно:)

ipython >= 5 имеет функцию автозаполнения, которая разбивает подклассу emacs, вы можете исправить это, изменив эту строку python-shell-interpreter-args "--colors=Linux --profile=default" и добавьте --simple-prompt.

Это позволит вам правильно видеть ipython, но по какой-то причине я еще не получил автозаполнение в emacs не так эффективно, как раньше.

Ответ 2

Как запустить код Python с помощью Emacs?

Я запускаю Emacs 26, версию vanilla dev (самостоятельно скомпилирован из источника, клонированного из Savannah).

(Обратите внимание, что в emacs docs обычно мы видим, например, Ctrl - c, обозначаемый как C-c)

В режиме Python (который я обычно вводю с помощью C-x C-f для "поиска" (возможно, нового) файла, заканчивающегося на .py), вы можете запустить оболочку Python с помощью и затем выполнить свой буфер if __name__ == '__main__': с помощью:

  • C-c C-p (который запускает run-python для создания оболочки с основным режимом Inferior Python, вспомогательным режимом Shell-Compile)

  • C-u C-c C-c (который выполняет python-shell-send-buffer с префиксным аргументом)

Нам нужен префиксный аргумент для отправки блока if __name__ == '__main__': в нижнюю оболочку Python.

Мы можем видеть все команды Ctrl - c с 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

Проверяя справку для python-shell-send-buffer (нажав на нее), мы видим:

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.

В соответствии с docs C-u - префиксный аргумент - и, по-видимому, является наиболее общим.

Обходной путь, который позволяет нам избежать использования префиксного аргумента C-u, использует круглые скобки:

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

вместо обычного:

if __name__ == '__main__':
    main()

а сам C-c C-c выполняет основную функцию.