Saat ini saya sedang mengerjakan proyek python yang berisi sub modul dan menggunakan numpy / scipy. Ipython digunakan sebagai konsol interaktif. Sayangnya saya tidak terlalu senang dengan alur kerja yang saya gunakan saat ini, saya sangat menghargai beberapa saran.
Dalam IPython, framework dimuat oleh import
perintah sederhana . Namun, sering kali perlu untuk mengubah kode di salah satu submodules dari framework. Pada titik ini model sudah dimuat dan saya menggunakan IPython untuk berinteraksi dengannya.
Sekarang, kerangka kerja berisi banyak modul yang saling bergantung, yaitu ketika kerangka kerja pertama kali dimuat, modul utama mengimpor dan mengkonfigurasi submodula. Perubahan pada kode hanya dijalankan jika modul dimuat ulang menggunakan reload(main_mod.sub_mod)
. Ini rumit karena saya perlu memuat ulang semua modul yang diubah secara individual menggunakan path lengkap. Akan sangat nyaman jika reload(main_module)
juga memuat ulang semua sub modul, tetapi tanpa memuat ulang numpy / scipy ..
However, it is often necessary to change code in one of the submodules of the framework.
Jadi mengapanecessary to change code
? Terima kasihJawaban:
IPython hadir dengan beberapa sihir reload otomatis :
Ini akan memuat ulang semua modul yang diubah setiap kali sebelum menjalankan baris baru. Cara kerjanya sedikit berbeda dari
dreload
. Beberapa peringatan berlaku, ketik%autoreload?
untuk melihat apa yang salah.Jika Anda ingin selalu mengaktifkan pengaturan ini, modifikasi file konfigurasi IPython Anda
~/.ipython/profile_default/ipython_config.py
[1] dan tambahkan:Kredit ke @Kos melalui komentar di bawah ini.
[1] Jika Anda tidak memiliki file
~/.ipython/profile_default/ipython_config.py
, Anda harus meneleponipython profile create
dulu. Atau file tersebut dapat ditemukan di$IPYTHONDIR
.sumber
c.InteractiveShellApp.extensions = ['autoreload']
danc.InteractiveShellApp.exec_lines = ['%autoreload 2']
di saya~/.ipython/profile_default/ipython_config.py
.Di IPython 0.12 (dan mungkin sebelumnya), Anda dapat menggunakan ini:
Ini pada dasarnya sama dengan jawaban oleh pv. , kecuali bahwa ekstensi telah diubah namanya dan sekarang dimuat menggunakan
%load_ext
.sumber
Untuk beberapa alasan, tidak ada
%autoreload
, ataudreload
tampaknya berfungsi untuk situasi ketika Anda mengimpor kode dari satu buku catatan ke yang lain . Hanya Python biasa yangreload
berfungsi:Berdasarkan [1] .
sumber
%autoreload
teknik ini. Ada laporan bug terbuka untuk menambahkan dukungan%autoreload
untuk ini. .IPython menawarkan
dreload()
untuk memuat ulang semua submodul secara rekursif. Secara pribadi, saya lebih suka menggunakan%run()
perintah ajaib (meskipun tidak melakukan pemuatan ulang yang dalam, seperti yang ditunjukkan oleh John Salvatier dalam komentar).sumber
dreload
telah diganti dalam IPython baru-baru ini (misalnya IPython 6.0) dengan deepreload .Modul bernama
importlib
memungkinkan untuk mengakses impor internal. Terutama, ini menyediakan fungsiimportlib.reload()
:Sebaliknya
%autoreload
,importlib.reload()
atur ulang variabel global yang diatur dalam modul. Dalam kebanyakan kasus, itulah yang Anda inginkan.importlib
hanya tersedia sejak Python 3.1. Untuk versi yang lebih lama, Anda harus menggunakan modulimp
.sumber
http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/
Untuk menghindari pengetikan fungsi ajaib itu berulang-ulang, mereka dapat dimasukkan ke dalam skrip startup ipython (Beri nama dengan .py suffix di bawah .ipython / profile_default / startup. Semua skrip python di bawah folder itu akan dimuat sesuai dengan urutan leksikal), yang terlihat seperti berikut:
sumber
%run script.py
Dari IPython REPLBagaimana dengan ini:
Ini harus secara efektif memuat ulang seluruh pohon modul dan submodul yang Anda berikan. Anda juga dapat menempatkan fungsi ini di .ipythonrc Anda (saya pikir) sehingga dimuat setiap kali Anda memulai penerjemah.
sumber
from ... import ...
atauimport ... as
. Setidaknya itu sering memberi saya masalah ketika bekerja secara interaktif di terminal. Saya telah pindah untuk menggunakan makro yang tersimpan di IPython yang melakukan impor dan pengaturan yang diperlukan untuk mulai bekerja dalam keadaan yang telah ditentukan.from ... import ...
danimport ... as
selama hal yang Anda impor adalah modul. Satu-satunya hal yang tidak tercakup adalah modul dalam paket yang tidak dimuat dari__init__.py
file itu. Untuk paket, Anda mungkin dapat memeriksa apakah__path__
atribut modul adalah direktori. Jika ya, lewati dan impor semua modul yang dapat Anda temukan secara rekursif. Saya tidak menulis bagian ini karena penulis belum meminta solusi untuk paket.pkgutil
untuk mendapatkan semua submodul dalam suatu paket, bahkan jika paket tidak mengimpor submodul ke modul teratas. stackoverflow.com/a/1707786/1243926sys.modules:
Pilihan lain:
Diverifikasi pada ipython dan ipython3 v5.1.0 di Ubuntu 14.04.
sumber
Praktik standar saya untuk memuat ulang adalah menggabungkan kedua metode berikut pembukaan pertama
IPython
:Memuat modul sebelum melakukan ini akan menyebabkan mereka tidak dimuat ulang, bahkan dengan manual
reload(module_name)
. Saya masih, sangat jarang, mendapatkan masalah yang tidak dapat dijelaskan dengan metode kelas yang tidak memuat ulang yang belum saya pelajari.sumber
Perhatikan bahwa yang disebutkan di atas
autoreload
hanya berfungsi di IntelliJ jika Anda menyimpan file yang diubah secara manual (mis. Menggunakan ctrl + s atau cmd + s). Tampaknya tidak berfungsi dengan hemat otomatis.sumber
Di Jupyter Notebooks di Anaconda, lakukan ini:
menghasilkan pesan:
Sepertinya lebih baik dilakukan:
Informasi versi:
sumber
Subjek apa pun tidak akan dimuat ulang dengan ini, saya yakin Anda harus menggunakan deepreload IPython untuk itu.
sumber