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?

El Diego Efe
quelle

Antworten:

9

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

import mymodule
import imp
imp.reload(mymodule)
Politza
quelle
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
eflanigan00
quelle
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

Moneda
quelle
Wunderbare Lösung! Du hast mir ein paar Stunden gespart! Vielen Dank!
DmitrySemenov