Wie kann man eine Python-Shell zwingen, Module erneut auszuführen, wenn ein Puffer ausgeführt wird?


9

Ich verwende Cc Cc, um einen Puffer an eine Python-Shell zu senden. Der Puffer hat zu Beginn einen Import. Ich habe festgestellt, dass das Ändern des zu importierenden Moduls die Änderungen nicht widerspiegelt, wenn ich den Puffer erneut mit Cc Cc ausführe (anscheinend führt der minderwertige Python den Import nur einmal durch).

Wie kann ich die Python-Shell zwingen, die bereits im ersten Lauf des Puffers aufgerufenen Module erneut zu importieren?

Antworten:


9

Sie können ein Modul wie folgt explizit neu laden:

import mymodule
import imp
imp.reload(mymodule)

Für Python> = 3.1 sollten Sie stattdessen importlib verwenden. Sehen Sie hier und hier .
Sinnvoller Benutzername

4

Das ist mein Workflow. Ich habe Emacs so eingestellt, dass sie Ipython verwenden

(setq
 python-shell-interpreter "ipython3"
 python-shell-interpreter-args "--simple-prompt --pprint")

Dann habe ich in ~ / .ipython / profile_default / startup / 00-ipython_init.py Folgendes eingefügt:

ip = get_ipython()
ip.magic('load_ext autoreload')

Dann gebe ich dies ein, wenn ich meine Module in ipython ändere und neu laden möchte. Ich mag das, weil es für alle Module funktioniert und ich mich nicht um Importabhängigkeiten kümmern muss.

%autoreload

1

Sie können dies tun, indem Sie den Python-Lauf ändern und den Python-Prozess zum Neustart zwingen:

;; Run python and pop-up its shell.
;; Kill process to solve the reload modules problem.
(defun my-python-shell-run ()
  (interactive)
  (when (get-buffer-process "*Python*")
     (set-process-query-on-exit-flag (get-buffer-process "*Python*") nil)
     (kill-process (get-buffer-process "*Python*"))
     ;; Uncomment If you want to clean the buffer too.
     ;;(kill-buffer "*Python*")
     ;; Not so fast!
     (sleep-for 0.5))
  (run-python (python-shell-parse-command) nil nil)
  (python-shell-send-buffer)
  ;; Pop new window only if shell isnt visible
  ;; in any frame.
  (unless (get-buffer-window "*Python*" t) 
    (python-shell-switch-to-shell)))

(defun my-python-shell-run-region ()
  (interactive)
  (python-shell-send-region (region-beginning) (region-end))
  (python-shell-switch-to-shell))

(eval-after-load "python"
  '(progn
     (define-key python-mode-map (kbd "C-c C-c") 'my-python-shell-run)
     (define-key python-mode-map (kbd "C-c C-r") 'my-python-shell-run-region)
     (define-key python-mode-map (kbd "C-h f") 'python-eldoc-at-point)))

http://lgmoneda.github.io/2017/02/19/emacs-python-shell-config-eng.html


Wunderbare Lösung! Du hast mir ein paar Stunden gespart! Vielen Dank!
DmitrySemenov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.