Comment forcer un shell Python à réimporter des modules lors de l'exécution d'un tampon?

9

J'utilise Cc Cc pour envoyer un tampon à un shell Python. Le tampon a une importation au début. J'ai trouvé que si je modifie le module que j'importe, il ne reflète pas les changements si je lance à nouveau le tampon avec Cc Cc (il semble que le Python inférieur n'effectue l'importation qu'une seule fois).

Comment puis-je forcer le shell Python à réimporter les modules déjà appelés lors de la première exécution du tampon?

El Diego Efe
la source

Réponses:

9

Vous pouvez explicitement recharger un module comme ceci:

import mymodule
import imp
imp.reload(mymodule)
politza
la source
Pour python> = 3.1, vous devez utiliser à la place importlib. Voir ici et ici .
Nom d'utilisateur significatif
4

Ceci est mon flux de travail. J'ai mis emacs pour utiliser ipython

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

Puis dans ~ / .ipython / profile_default / startup / 00-ipython_init.py je mets ce qui suit:

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

Ensuite, je tape ceci chaque fois que je modifie et que je veux recharger mes modules en ipython. J'aime cela car cela fonctionne pour tous les modules et je n'ai pas à me soucier des dépendances d'importation.

%autoreload
eflanigan00
la source
1

Vous pouvez le faire en modifiant l'exécution de python et en forçant le processus Python à redémarrer:

;; 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
la source
Magnifique solution! Tu m'as sauvé quelques heures! Je vous remercie!
DmitrySemenov