Interactive Python (ipython) sungguh luar biasa, terutama karena Anda menyatukan semuanya dengan cepat ... dan melakukannya sedemikian rupa sehingga mudah untuk kembali.
Namun, yang tampaknya menarik adalah kasus penggunaan memiliki beberapa notebook ipython (file ipynb). Tampaknya notebook TIDAK seharusnya memiliki hubungan dengan notebook lain, yang masuk akal, kecuali bahwa saya ingin mengimpor file ipynb lainnya.
Satu-satunya solusi yang saya lihat adalah mengonversi file * .ipynb saya menjadi file * .py, yang kemudian dapat diimpor ke notebook saya. Memiliki satu file yang menampung semuanya dalam sebuah proyek agak aneh, terutama jika saya ingin benar-benar mendorong penggunaan ulang kode (bukankah itu prinsip inti python?).
Apakah saya melewatkan sesuatu? Apakah ini bukan kasus penggunaan notebook ipython yang didukung? Apakah ada solusi lain yang dapat saya gunakan untuk mengimpor file ipynb ke notebook lain? Saya ingin terus menggunakan ipynb, tetapi itu benar-benar mengacaukan alur kerja saya sekarang :(
--script
untuk menyimpan salinan .py dari buku catatan Anda. Di IPython 2.0, Anda akan dapat%run
menggunakan notebook. Kami masih mengerjakan mekanisme yang lebih baik untuk penggunaan ulang kode.Jawaban:
Ini sangat sederhana di Jupyter yang lebih baru:
sumber
__name__ == '__main__' and '__file__' not in globals()
untuk memverifikasi jika Anda berada di buku catatan anak. (dari blog.sicara.com/… )u'MyOtherNotebook.ipynb.py'
tidak ditemukan.Jika Anda ingin mengimpor
A.ipynb
diB.ipynb
tulisimport import_ipynb import A
di
B.ipynb
.The
import_ipynb
Modul Saya telah membuat diinstal melalui pip:Itu hanya satu file dan itu secara ketat mengikuti petunjuk resmi di situs jupyter.
PS Ini juga mendukung hal-hal seperti
from A import foo
,from A import *
dllsumber
pip install import-ipynb
juga berfungsi dan menginstal paket yang sama, tetapi karena python tidak mengizinkan Anda untuk menulisimport import-ipynb
dan menganggap itu hanya satu file,pip install import_ipynb
terlihat lebih konsisten bagi saya.import nbimporter
danimport import_ipynb
?Lari
!pip install ipynb
lalu impor buku catatan lain sebagai
from ipynb.fs.full.<notebook_name> import *
atau
from ipynb.fs.full.<notebook_name> import <function_name>
Pastikan semua buku catatan berada di direktori yang sama.
Edit 1: Anda dapat melihat dokumentasi resmi di sini - https://ipynb.readthedocs.io/en/stable/
Juga, jika Anda ingin mengimpor hanya kelas & fungsi definisi dari notebook (dan bukan laporan tingkat atas), Anda dapat menggunakan
ipynb.fs.defs
bukanipynb.fs.full
. Tugas variabel huruf besar penuh akan dievaluasi juga.sumber
ipynb
paket juga mendukung pelaksanaan parsial definisi saja. Ini adalah paket resmi dari IPyhton, jadi saya yakin ini adalah jawaban yang diterima.MyFolder/book.ipynb
Instal ipynb dari command prompt Anda
pip install import-ipynb
Impor dalam file buku catatan Anda
import import_ipynb
Sekarang gunakan perintah impor biasa untuk mengimpor file Anda
import MyOtherNotebook
sumber
Anda bisa menggunakan
import nbimporter
ituimport notebookName
sumber
conda install -c conda-forge importnb
Komentar yang disebutkan di atas sangat berguna tetapi agak sulit untuk diterapkan. Langkah-langkah di bawah ini dapat Anda coba, saya juga mencobanya dan berhasil:
sumber
import callee
, tidak bisa kerja.Masalahnya adalah notebook bukanlah file python biasa. Langkah-langkah untuk mengimpor
.ipynb
file diuraikan sebagai berikut: Mengimpor notebookSaya menempelkan kode, jadi jika Anda membutuhkannya ... Anda dapat melakukan salin dan tempel cepat. Perhatikan bahwa pada akhirnya saya memiliki
import primes
pernyataan itu. Anda harus mengubahnya tentu saja. Nama file saya adalahprimes.ipynb
. Mulai saat ini Anda dapat menggunakan konten di dalam file itu seperti yang biasa Anda lakukan.Berharap ada metode yang lebih sederhana, tetapi ini langsung dari dokumen.
Catatan: Saya menggunakan jupyter bukan ipython.
import io, os, sys, types from IPython import get_ipython from nbformat import current from IPython.core.interactiveshell import InteractiveShell def find_notebook(fullname, path=None): """find a notebook, given its fully qualified name and an optional path This turns "foo.bar" into "foo/bar.ipynb" and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar does not exist. """ name = fullname.rsplit('.', 1)[-1] if not path: path = [''] for d in path: nb_path = os.path.join(d, name + ".ipynb") if os.path.isfile(nb_path): return nb_path # let import Notebook_Name find "Notebook Name.ipynb" nb_path = nb_path.replace("_", " ") if os.path.isfile(nb_path): return nb_path class NotebookLoader(object): """Module Loader for Jupyter Notebooks""" def __init__(self, path=None): self.shell = InteractiveShell.instance() self.path = path def load_module(self, fullname): """import a notebook as a module""" path = find_notebook(fullname, self.path) print ("importing Jupyter notebook from %s" % path) # load the notebook object with io.open(path, 'r', encoding='utf-8') as f: nb = current.read(f, 'json') # create the module and add it to sys.modules # if name in sys.modules: # return sys.modules[name] mod = types.ModuleType(fullname) mod.__file__ = path mod.__loader__ = self mod.__dict__['get_ipython'] = get_ipython sys.modules[fullname] = mod # extra work to ensure that magics that would affect the user_ns # actually affect the notebook module's ns save_user_ns = self.shell.user_ns self.shell.user_ns = mod.__dict__ try: for cell in nb.worksheets[0].cells: if cell.cell_type == 'code' and cell.language == 'python': # transform the input to executable Python code = self.shell.input_transformer_manager.transform_cell(cell.input) # run the code in themodule exec(code, mod.__dict__) finally: self.shell.user_ns = save_user_ns return mod class NotebookFinder(object): """Module finder that locates Jupyter Notebooks""" def __init__(self): self.loaders = {} def find_module(self, fullname, path=None): nb_path = find_notebook(fullname, path) if not nb_path: return key = path if path: # lists aren't hashable key = os.path.sep.join(path) if key not in self.loaders: self.loaders[key] = NotebookLoader(path) return self.loaders[key] sys.meta_path.append(NotebookFinder()) import primes
sumber
Tidak ada masalah sama sekali menggunakan Jupyter dengan modul .py Python yang sudah ada atau yang baru. Dengan Jupyter berjalan, cukup jalankan Spyder (atau editor apa pun pilihan Anda) untuk membangun / memodifikasi definisi kelas modul Anda dalam file .py, lalu cukup impor modul sesuai kebutuhan ke dalam Jupyter.
Satu hal yang membuat ini sangat mulus adalah menggunakan ekstensi ajaib autoreload. Anda dapat melihat dokumentasi untuk autoreload di sini:
http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html
Berikut adalah kode untuk memuat ulang modul secara otomatis setiap kali telah diubah:
# autoreload sets up auto reloading of modified .py modules import autoreload %load_ext autoreload %autoreload 2
Perhatikan bahwa saya mencoba kode yang disebutkan dalam balasan sebelumnya untuk mensimulasikan pemuatan file .ipynb sebagai modul, dan membuatnya berfungsi, tetapi tersedak ketika Anda membuat perubahan pada file .ipynb. Sepertinya Anda perlu memulai ulang lingkungan pengembangan Jupyter untuk memuat ulang 'modul' .ipynb, yang tidak dapat saya terima karena saya membuat banyak perubahan pada kode saya.
sumber
Harap pastikan bahwa Anda juga menambahkan
__init__.py
file dalam paket tempat semua file .ipynb Anda yang lain berada.Ini adalah tambahan dari tautan nbviewer yang
minrk
dansyi
disediakan di atas.Saya juga memiliki masalah serupa dan kemudian saya menulis solusinya serta tautan ke folder Google drive publik saya yang memiliki contoh yang berfungsi :)
Posting Stackoverflow saya dengan eksperimen dan Solusi langkah demi langkah:
Notebook Jupyter: Impor file .ipynb dan akses metodenya di file .ipynb lain yang memberikan kesalahan
Semoga ini bisa membantu orang lain juga. Terima kasih semuanya!
sumber