ipynb mengimpor file ipynb lainnya


90

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 :(



2
Anda dapat memulai server buku catatan dengan --scriptuntuk menyimpan salinan .py dari buku catatan Anda. Di IPython 2.0, Anda akan dapat %runmenggunakan notebook. Kami masih mengerjakan mekanisme yang lebih baik untuk penggunaan ulang kode.
Thomas K

1
Contoh ini menunjukkan cara mengimpor notebook IPython sebagai modul tanpa mengekspor duplikat sebagai skrip.
minrk

Jawaban:


130

Ini sangat sederhana di Jupyter yang lebih baru:

%run MyOtherNotebook.ipynb

5
% run MyOtherNotebook.ipynb melakukan pekerjaan itu untuk saya. (tidak '')
Florian H

6
Hati-hati, metode ini akan sepenuhnya menjalankan buku catatan anak. Anda dapat menambahkan tanda centang __name__ == '__main__' and '__file__' not in globals()untuk memverifikasi jika Anda berada di buku catatan anak. (dari blog.sicara.com/… )
Flavian Hautbois

8
% run 'MyOtherNotebook.ipynb' ERROR: root: File u'MyOtherNotebook.ipynb.py'tidak ditemukan.
pengguna3673

1
@ Kocur4d Terima kasih telah memperbaiki! Yang cukup menarik, ini berhasil bagi saya (dengan kutipan) ketika saya mencobanya, tetapi contoh dalam dokumentasi tidak memiliki kutipan apa pun.
johndodo

3
jika ada yang menemukannya, Anda juga dapat menggunakan jalur lengkap seperti% run "/path/to/my/file/notebook.ipynb"
Jeremie

33

Jika Anda ingin mengimpor A.ipynbdi B.ipynbtulis

import import_ipynb
import A

di B.ipynb .

The import_ipynbModul Saya telah membuat diinstal melalui pip:

pip install import_ipynb

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 *dll


@Crash pip install import-ipynbjuga berfungsi dan menginstal paket yang sama, tetapi karena python tidak mengizinkan Anda untuk menulis import import-ipynbdan menganggap itu hanya satu file, pip install import_ipynbterlihat lebih konsisten bagi saya.
axil

3
Apakah ada perbedaan antara import nbimporterdan import import_ipynb?
Fractale

1
Ini tidak berfungsi sama sekali di Jupyter saya dengan Python 3
Sebastialonso

@Sebastialonso Apa sebenarnya yang tidak berhasil? Jelaskan apa yang Anda lakukan dan pesan kesalahan apa yang Anda lihat. Idealnya buka tiket di github.
axil

@axil Saya memiliki kesalahan yang sama di mana tidak berhasil untuk saya di Py3. Ini memberi saya kesalahan berikut - ModuleNotFoundError: Tidak ada modul bernama 'A' PS: A. ipynb ada di folder yang sama
Soman Dubey

10

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.defsbukan ipynb.fs.full. Tugas variabel huruf besar penuh akan dievaluasi juga.


Bagaimana jika nama file saya memiliki spasi di dalamnya?
Sameh

Disarankan untuk tidak menyimpan spasi apa pun dalam nama file Anda
Malgo

2
Perhatikan bahwa dalam kedua kasus yang dijelaskan, buku catatan yang diimpor dijalankan secara penuh. The ipynbpaket juga mendukung pelaksanaan parsial definisi saja. Ini adalah paket resmi dari IPyhton, jadi saya yakin ini adalah jawaban yang diterima.
amka66

Bisakah ini mengimpor buku catatan di dalam folder? misalnyaMyFolder/book.ipynb
tulang225

Ini terlihat bagus tetapi gagal ketika bertemu misalnya% matplotlib inline ....
jtlz2

7

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

Jawaban paling sederhana namun menjelaskan. Terima kasih!
The Poor Jew

3

Anda bisa menggunakan import nbimporterituimport notebookName


+1, nbimporter bekerja seperti pesona bagi saya, juga dapat dipasang menggunakan conda:conda install -c conda-forge importnb
Zuku

2

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:

  1. Unduh file itu dari buku catatan Anda dalam format file PY (Anda dapat menemukan opsi itu di tab File).
  2. Sekarang salin file yang diunduh ke direktori kerja Notebook Jupyter
  3. Anda sekarang siap menggunakannya. Cukup impor File .PY ke dalam file ipynb

hmm ... Saya mengonversi callee.ipync ke file callee.py, dan kemudian mengunggah file callee.py ke notebook di bawah folder yang sama dengan caller.ipync, dan in caller.ipync yang baru saya tulis import callee, tidak bisa kerja.
Elsa Lin

ps IPython adalah versi: 5.1.0.
Elsa Lin

1

Masalahnya adalah notebook bukanlah file python biasa. Langkah-langkah untuk mengimpor .ipynbfile diuraikan sebagai berikut: Mengimpor notebook

Saya menempelkan kode, jadi jika Anda membutuhkannya ... Anda dapat melakukan salin dan tempel cepat. Perhatikan bahwa pada akhirnya saya memiliki import primespernyataan itu. Anda harus mengubahnya tentu saja. Nama file saya adalah primes.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

1

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.


0

Harap pastikan bahwa Anda juga menambahkan __init__.pyfile dalam paket tempat semua file .ipynb Anda yang lain berada.

Ini adalah tambahan dari tautan nbviewer yang minrkdan syidisediakan 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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.