Bagaimana cara memaksa shell Python untuk mengimpor kembali modul saat menjalankan buffer?

9

Saya menggunakan Cc Cc untuk mengirim buffer ke shell Python. Buffer memiliki impor di awal. Saya menemukan bahwa jika saya memodifikasi modul yang saya impor, itu tidak mencerminkan perubahan jika saya menjalankan buffer lagi dengan Cc Cc (sepertinya Python inferior melakukan impor hanya sekali).

Bagaimana saya bisa memaksa shell Python untuk mengimpor lagi modul yang sudah dipanggil di jalankan pertama dari buffer?

El Diego Efe
sumber

Jawaban:

9

Anda dapat memuat ulang modul secara eksplisit seperti:

import mymodule
import imp
imp.reload(mymodule)
politza
sumber
Untuk python> = 3.1 Anda harus menggunakan importlib sebagai gantinya. Lihat di sini dan di sini .
Nama pengguna yang berarti
4

Ini adalah alur kerja saya. Saya mengatur emacs untuk menggunakan ipython

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

Kemudian di ~ / .ipython / profile_default / startup / 00-ipython_init.py saya masukkan yang berikut ini:

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

Lalu saya ketik ini setiap kali saya memodifikasi dan ingin memuat kembali modul saya di ipython. Saya suka ini karena berfungsi untuk semua modul dan saya tidak perlu khawatir tentang ketergantungan impor.

%autoreload
eflanigan00
sumber
1

Anda dapat melakukannya dengan memodifikasi menjalankan python dan memaksa proses Python untuk memulai kembali:

;; 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
sumber
Solusi luar biasa! Anda menyelamatkan saya beberapa jam! Terima kasih!
DmitrySemenov