2014-09-04 5 views
10

Sto provando a eseguire codice Python per test e debug usando Emacs. Come devo eseguire il debug ed eseguire il codice nei file * .py? Ho provato a utilizzare i comandi M-x compile. Usando M-x compile, ottengo un buffer di compilazione che si blocca (Dice che Python sta compilando, ma poi non succede niente).Come si esegue il codice Python usando Emacs?

risposta

23

Se si utilizza emacs24 questo dovrebbe essere il default (in emacs23 è necessario python.el, non python-mode.el):

In un buffer di pitone:

  • Cc Cz: aperto un guscio pitone
  • Cc Cc: eseguire il contenuto del buffer nel guscio pitone aperto
  • Cc Cr: eseguire la regione selezionata nel guscio pitone
shell Python

di default è "python", se si nee di utilizzare ipython è possibile utilizzare questo conf nel vostro .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") 

purché si disponga ipython installato nel sistema ovviamente :)

ipython > = 5 ha una funzione di completamento automatico che interrompe la sottocampo di emacs, è possibile risolvere questo modificando questa riga python-shell-interpreter-args "--colors=Linux --profile=default" e aggiungere --simple-prompt.

Permette di vedere ipython correttamente ma per qualche motivo non ho ancora ottenuto il completamento automatico in emacs non è così efficace come un tempo.

1

Come si esegue il codice Python utilizzando Emacs?

Sto eseguendo Emacs 26, versione vanilla dev (auto compilato dalla sorgente clonata da Savannah).

(Si noti che in Emacs documenti, vediamo solitamente, per esempio, Ctrl - c indicato come Cc)

In modalità Python (che di solito entro utilizzando Cx Cf "trovare" un (possibilmente nuovo) file con estensione .py), è possibile avviare una shell Python con e quindi eseguire di
if __name__ == '__main__': con il buffer:

  • Cc Cp (che esegue run-python per creare una shell con Python inferioremodalità principale, Shell-compilare modo minore)

  • Cu Cc Cc (che esegue python-shell-send-buffer con un argomento prefisso)

Si richiede l'argomento prefisso per inviare il blocco if __name__ == '__main__': a la shell di Python inferiore.

Possiamo vedere tutti i Ctrl - c comandi con 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 

Controllo l'aiuto per pitone-shell-inviare-buffer (andando esso), vediamo:

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. 

Secondo la docs Cu è un argomento prefisso - e sembra essere il più generico.

Una soluzione che permette di evitare di utilizzare l'argomento prefisso C-u utilizza parentesi:

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

invece della solita:

if __name__ == '__main__': 
    main() 

e poi C-c C-c per sé esegue la funzione principale.