ipynb імпортувати інший файл ipynb


90

Інтерактивний Python (ipython) просто вражає, тим більше, що ви складаєте речі на льоту ... і робить це таким чином, що легко повернутися назад.

Однак цікавим видається варіант використання декількох блокнотів ipython (файли ipynb). Очевидно, здається, що блокнот НЕ повинен мати стосунків з іншими блокнотами, що має сенс, за винятком того, що я хотів би імпортувати інші файли ipynb.

Єдине обхідне рішення, яке я бачу, - це перетворення файлів * .ipynb у файли * .py, які потім можна імпортувати до мого блокнота. Мати в одному файлі все, що є в проекті, трохи дивно, особливо якщо я хочу наполегливо вимагати повторного використання коду (хіба це не основний принцип python?).

Мені чогось не вистачає? Це не підтримуваний випадок використання ноутбуків ipython? Чи є інше рішення, яке я можу використовувати для цього імпорту файлу ipynb в інший блокнот? Я хотів би продовжувати використовувати ipynb, але це справді заплутує мій робочий процес прямо зараз :(



2
Ви можете запустити сервер ноутбуків, --scriptщоб зберегти .py копії своїх блокнотів. В IPython 2.0 ви зможете %runстворити блокнот. Ми все ще розробляємо вдосконалені механізми повторного використання коду.
Thomas K

1
Цей приклад показує, як імпортувати блокноти IPython як модулі без експорту дублікатів як сценарії.
minrk

Відповіді:


130

У новому Юпітері це насправді просто:

%run MyOtherNotebook.ipynb

5
% run MyOtherNotebook.ipynb зробив роботу за мене. (ні '')
Флоріан Н

6
Будьте обережні, цей спосіб повністю запустить дитячий блокнот. Ви можете додати чек, __name__ == '__main__' and '__file__' not in globals()щоб перевірити, чи перебуваєте ви в зошиті дитини. (з blog.sicara.com/… )
Флавіан Готбуа

8
% run 'MyOtherNotebook.ipynb' ПОМИЛКА: root: Файл u'MyOtherNotebook.ipynb.py'не знайдено.
user3673

1
@ Kocur4d Дякуємо за виправлення! Цікаво, що це спрацювало у мене (із цитатами), коли я спробував, але приклади в документації не містять жодних цитат.
johndodo

3
якщо хтось натрапляє на це, ви також можете використовувати повний шлях, такий як% run "/path/to/my/file/notebook.ipynb"
Джеремі

33

Якщо ви хочете імпортувати A.ipynbв письмовій B.ipynbформі

import import_ipynb
import A

в B.ipynb.

import_ipynbМодуль я створив встановлюється через піп:

pip install import_ipynb

Це лише один файл, і він суворо дотримується офіційних інструкцій на сайті jupyter.

PS Він також підтримує такі речі from A import foo, і from A import *т.д.


@Crash pip install import-ipynbтакож працює і встановлює той самий пакет, але оскільки python не дозволяє вам писати, import import-ipynbа враховуючи, що це лише один файл, pip install import_ipynbмені здається більш послідовним.
axil

3
Чи є якась різниця між import nbimporterі import import_ipynb?
Fractale

1
Це взагалі не працює в моєму Юпітері з Python 3
Себастіалонсо,

@Sebastialonso Що саме не працює? Опишіть, що ви робите, і які повідомлення про помилки ви бачите. Ідеально відкрити квиток на github.
axil

@axil У мене така сама помилка, коли вона не працює для мене в Py3. Це видає мені таку помилку - ModuleNotFoundError: Жодного модуля з назвою 'A' PS: A.ipynb не існує в одній папці
Soman Dubey

10

Біжи

!pip install ipynb

а потім імпортуйте інший блокнот як

from ipynb.fs.full.<notebook_name> import *

або

from ipynb.fs.full.<notebook_name> import <function_name>

Переконайтеся, що всі блокноти знаходяться в одному каталозі.

Редагування 1: Офіційну документацію ви можете переглянути тут - https://ipynb.readthedocs.io/en/stable/

Крім того, якщо ви хочете імпортувати лише визначення класу та функції із блокнота (а не оператори верхнього рівня), ви можете використовувати ipynb.fs.defsзамість ipynb.fs.full. Також буде оцінено повне призначення великих змінних.


Що робити, якщо в моєму файлі є пробіли?
Самех

Рекомендується не зберігати пробіли у назві файлу
Мальго,

2
Зауважте, що в обох описаних випадках імпортований блокнот виконується повністю. ipynbПакет також підтримує часткове виконання тільки визначень. Це офіційний пакет IPyhton, тому я вважаю, що це має бути прийнятою відповіддю.
amka66

Чи може це імпортувати блокноти всередині папки? наприкладMyFolder/book.ipynb
bone225

Це виглядало добре, але падає, коли зустрічається, наприклад,% matplotlib inline ....
jtlz2

7

Встановіть ipynb із командного рядка

pip install import-ipynb

Імпортуйте у файл блокнота

import import_ipynb

Тепер використовуйте звичайну команду імпорту для імпорту вашого файлу

import MyOtherNotebook

Найпростіша, але пояснююча відповідь. Дякую!
Бідний єврей

3

import nbimporterТоді можна використовуватиimport notebookName


+1, nbimporter працює для мене як шарм, також його можна встановити за допомогою conda:conda install -c conda-forge importnb
Zuku

2

Вищезазначені коментарі дуже корисні, але їх дещо складно реалізувати. Нижче ви можете спробувати, я теж спробував, і це спрацювало:

  1. Завантажте цей файл із блокнота у форматі PY (цей параметр можна знайти на вкладці Файл).
  2. Тепер скопіюйте завантажений файл у робочий каталог Jupyter Notebook
  3. Тепер ви готові це використовувати. Просто імпортуйте файл .PY у файл ipynb

хм ... я перетворив файл callee.ipync у файл callee.py, а потім завантажив файл callee.py на блокнот в ту саму папку з caller.ipync, а файл in caller.ipync, який я щойно написав import callee, просто не зміг робота.
Ельза Лін

ps IPython - версія: 5.1.0.
Ельза Лін,

1

Справа в тому, що блокноти - це не простий файл python. Етапи імпортування .ipynbфайлу описані нижче: Імпортування блокнота

Я вставляю код, тому, якщо він вам потрібен ... ви можете просто швидко скопіювати та вставити. Зверніть увагу, що в кінці у мене є import primesзаява. Вам доведеться це змінити, звичайно. Ім'я мого файлу - primes.ipynb. З цього моменту ви можете використовувати вміст у цьому файлі, як це робите регулярно.

Хотілося б, щоб був простіший метод, але це прямо з документів.
Примітка: Я використовую jupyter, а не 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

Немає жодних проблем із використанням Jupyter з існуючими або новими модулями .py Python. Запустивши Jupyter, просто запустіть Spyder (або будь-який вибраний вами редактор), щоб створити / змінити визначення класів модулів у файлі .py, а потім просто імпортувати модулі за необхідності в Jupyter.

Одна річ, яка робить це по-справжньому бездоганним, - використання магічного розширення автозавантаження. Ви можете переглянути документацію для автозавантаження тут:

http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html

Ось код для автоматичного перезавантаження модуля в будь-який час, коли він був змінений:

# autoreload sets up auto reloading of modified .py modules
import autoreload
%load_ext autoreload
%autoreload 2

Зверніть увагу, що я спробував код, згаданий у попередній відповіді, для імітації завантаження файлів .ipynb як модулів і змусив його працювати, але він задихається, коли ви вносите зміни у файл .ipynb. Схоже, вам потрібно перезапустити середовище розробки Jupyter, щоб перезавантажити модуль .ipynb, що було неприйнятно для мене, оскільки я вношу багато змін у свій код.


0

Будь ласка, переконайтеся, що ви також додали __init__.pyфайл у пакет, де знаходяться всі ваші інші файли .ipynb.

Це на додаток до заслання nbviewer , що minrkі syiнаведеної вище.

У мене також була якась подібна проблема, а потім я написав рішення, а також посилання на мою загальнодоступну папку Google Drive, яка має робочий приклад :)

Мій пост Stackoverflow із поетапними експериментами та рішенням:

Блокнот Jupyter: Імпортуйте файл .ipynb і отримайте доступ до його методу в іншому файлі .ipynb, що видає помилку

Сподіваюся, це допоможе і іншим. Дякую усім!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.