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