2014-09-04 7 views
10

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

ответ

23

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

В питона буфер:

  • Cc Cz: открытая питон оболочки
  • Cc Cc: запустить содержимое буфера в открытом питона оболочки
  • Cc Cr: запустить выбранный регион в оболочке Python

по умолчанию оболочка питон «питон», если вы урожденная использовать IPython вы можете использовать эту конф в ваш .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 не так эффективно, как раньше.

1

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

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

(Обратите внимание, что в Emacs документации, мы обычно видим, например, Ctrl - с обозначается как Сс)

В режиме Python (который я обычно вводить с помощью Cx Cf, чтобы «найти» (возможно, новый файл), оканчивающийся на .py), вы можете запустить оболочку Python с, а затем выполнить ваш буфер
if __name__ == '__main__': с:

  • Cc Cp (который выполняет запуск-питон, чтобы создать оболочку с худшим PythonОсновной режим, Shell-компилирование второстепенного режима)

  • Cu Cc Cc (который выполняет питон-оболочка-отправить-буфер с префиксом аргументом)

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

Мы можем увидеть все Ctrl - с команды с Ctrl - с?

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 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 Cu является префиксный аргумент - и, по-видимому, является наиболее общим.

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

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

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

if __name__ == '__main__': 
    main() 

, а затем С-С С-с по себе выполняет основную функцию.

Смежные вопросы