Интерактивный Python (ipython) просто потрясающий, особенно если вы собираете все по кусочкам на лету ... и делаете это таким образом, чтобы было легко вернуться назад.
Однако, что кажется интересным, так это случай использования нескольких записных книжек ipython (файлов ipynb). Похоже, что ноутбук НЕ должен иметь связи с другими ноутбуками, что имеет смысл, за исключением того, что я хотел бы импортировать другие файлы ipynb.
Единственный обходной путь, который я вижу, - это преобразование моих файлов * .ipynb в файлы * .py, которые затем можно импортировать в мою записную книжку. Наличие одного файла, содержащего все в проекте, немного странно, особенно если я действительно хочу настаивать на повторном использовании кода (разве это не основной принцип Python?).
Я что-то упускаю? Разве это не поддерживаемый вариант использования ноутбуков ipython? Есть ли другое решение, которое я могу использовать для импорта файла ipynb в другой ноутбук? Я бы с удовольствием продолжил использовать ipynb, но сейчас это действительно мешает моему рабочему процессу :(
--script
чтобы сохранить копии ваших записных книжек в формате .py. В IPython 2.0 вы сможете%run
использовать ноутбук. Мы все еще работаем над улучшенными механизмами повторного использования кода.Ответы:
В новом Jupyter это действительно просто:
источник
__name__ == '__main__' and '__file__' not in globals()
чтобы проверить, находитесь ли вы в дочерней записной книжке. (от blog.sicara.com/… )u'MyOtherNotebook.ipynb.py'
не найден.Если вы хотите импортировать
A.ipynb
вB.ipynb
записиimport import_ipynb import A
в
B.ipynb
.Созданный
import_ipynb
мной модуль устанавливается через pip:Это всего лишь один файл, и он строго соответствует официальному руководству на сайте jupyter.
PS Он также поддерживает такие вещи, как
from A import foo
иfrom A import *
т. Д.источник
pip install import-ipynb
также работает и устанавливает один и тот же пакет, но, поскольку python не позволяет вам писатьimport import-ipynb
и, учитывая, что это всего лишь один файл,pip install import_ipynb
мне кажется, более последовательным.import nbimporter
иimport import_ipynb
?Бегать
!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
. Также оценивается полное присвоение переменной верхнего регистра.источник
ipynb
Пакет также поддерживает частичное выполнение только определений. Это официальный пакет IPyhton, поэтому я считаю, что это должен быть принятый ответ.MyFolder/book.ipynb
Установите ipynb из командной строки
pip install import-ipynb
Импортируйте в файл записной книжки
import import_ipynb
Теперь используйте обычную команду импорта, чтобы импортировать файл
import MyOtherNotebook
источник
Вы можете использовать
import nbimporter
тогдаimport notebookName
источник
conda install -c conda-forge importnb
Вышеупомянутые комментарии очень полезны, но их немного сложно реализовать. Ниже приведены шаги, которые вы можете попробовать, я тоже попробовал, и это сработало:
источник
import callee
, просто не мог Работа.Проблема в том, что записные книжки - это не простой файл 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
источник
Нет никаких проблем с использованием Jupyter с существующими или новыми модулями Python .py. При запущенном 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, что для меня было неприемлемо, поскольку я вношу много изменений в свой код.
источник
Убедитесь, что вы также добавили
__init__.py
в пакет файл, в котором находятся все остальные файлы .ipynb.Это в дополнение к ссылке nbviewer, которая
minrk
иsyi
приведенной выше.У меня тоже была похожая проблема, и я написал решение, а также ссылку на мою общедоступную папку диска Google, в которой есть рабочий пример :)
Мой пост в Stackoverflow с пошаговыми экспериментами и решением:
Блокнот Jupyter: импорт файла .ipynb и доступ к его методу в другом файле .ipynb с ошибкой
Надеюсь, это поможет и другим. Спасибо всем!
источник