web-dev-qa-db-fra.com

Comment exécutez-vous Python code en utilisant Emacs?

J'essaie d'exécuter Python code pour tester et déboguer avec Emacs. Comment déboguer et exécuter du code dans des fichiers * .py? J'ai essayé d'utiliser le M-x compile commandes. En utilisant M-x compile, J'obtiens un tampon de compilation qui plante (Il dit Python est en train de compiler, mais alors rien ne se passe).

24
quark

Si vous utilisez emacs24, cela devrait être la valeur par défaut (dans emacs23, vous avez besoin de python.el, pas de python-mode.el):

Dans un tampon python:

  • C-c C-z: ouvrir un python Shell
  • C-c C-c: exécuter le contenu du tampon dans le shell ouvert python
  • C-c C-r: exécutez la région sélectionnée dans le shell python

default python Shell est "python", si vous voulez utiliser ipython, vous pouvez utiliser cette conf dans votre .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")

à condition que vous ayez bien installé ipython dans votre système :)

ipython> = 5 a une fonctionnalité de saisie semi-automatique qui rompt le sous-shell emacs, vous pouvez résoudre ce problème en modifiant cette ligne python-Shell-interpreter-args "--colors=Linux --profile=default" et ajouter --simple-Prompt.

Cela vous permettra de voir correctement ipython, mais pour une raison quelconque, je n'ai pas encore obtenu l'auto-complétion dans emacs n'est pas aussi efficace qu'auparavant.

37
Oberix

Comment exécutez-vous Python code en utilisant Emacs?

J'utilise Emacs 26, version de développement Vanilla (auto-compilé à partir de la source clonée à partir de Savannah ).

(Notez que dans les documents emacs, nous voyons généralement, par exemple, Ctrl-c noté C-c)

En Python (que j'entre habituellement en utilisant Cx Cf pour "trouver" un (éventuellement nouveau) fichier se terminant par .py), vous pouvez démarrer un Python = Shell avec, puis exécutez votre tampon
if __name__ == '__main__': avec:

  • C-c C-p (qui exécute run-python pour créer un shell avec inférieur Python, mode mineur Shell-Compile)

  • C-u C-c C-c (qui exécute python-Shell-send-buffer avec un argument préfixe)

Nous avons besoin de l'argument préfixe pour envoyer le if __name__ == '__main__': bloquer à l'inférieur Python Shell.

Nous pouvons voir tous les Ctrl-c commandes avec 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

En inspectant l'aide pour python-Shell-send-buffer (en cliquant dessus), nous voyons:

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.

Selon le docs C-u est un argument de préfixe - et semble être le plus générique.

Une solution de contournement qui nous permet d'éviter d'utiliser l'argument préfixe C-u utilise des parenthèses:

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

au lieu de l'habituel:

if __name__ == '__main__':
    main()

puis C-c C-c exécute lui-même la fonction principale.

10
Aaron Hall

À mon avis, M-! et M-& sont sous-estimés. Souvent, vous voulez simplement démarrer le script actuel sur lequel vous travaillez, pas besoin de compliquer les choses.

Bien sûr, vous pouvez utiliser M-x compile, tant que vous n'avez pas à fournir de saisie interactive. Si vous faire doivent fournir une entrée interactive, M-x Shell est votre ami.

Si vous voulez exécuter des choses avec une seule pression sur un bouton, consultez F3 et F4 pour enregistrer une macro clavier et la rejouer (la macro peut également être liée à une touche, par ex. F5).

Dans chacun de ces cas, il n'y a pas de "magie". Emacs ne sait pas "compiler" ou "exécuter" python. Vous devez fournir/écraser une invocation de ligne de commande sensible, comme:

Compile Command: ipython <yourscriptname>.py

Le sous-shell python est cool où un style de développement REPL est logique, mais au moins sous Windows matplotlib, tkinter et les autres bibliothèques qui doivent gérer la boucle de messages Windows ont tendance à bloquer/bloquer lors de l'affichage des éléments de l'interface graphique.

2
T Nierath