Повторное использование кода из разных IPython-ноутбуков

Я использую IPython и хочу запускать функции из одного ноутбука из другого (без вырезания и вставки их между различными ноутбуками). Возможно ли это и достаточно легко сделать?

Ответ 1

Вы можете подключиться с помощью qtconsole к тому же ядру. Просто поставьте это при запуске:

ipython qtconsole --existing kernel-0300435c-3d07-4bb6-abda-8952e663ddb7.json

Посмотрите на выход после запуска ноутбука для длинной строки.

Ответ 2

Запуск вашего ноутбука с помощью:

ipython notebook --script

сохранит записные книжки (.ipynb) как скрипты Python (.py), и вы сможете их импортировать.

Или посмотрите: http://nbviewer.ipython.org/5491090/, который содержит 2 ноутбука, один из которых выполняет другой.

Ответ 4

Ipythons %run magic позволяет выполнять python файлы и скрипты ipython в ноутбуке. Иногда я использую параметр -i, поэтому он запускается в пространстве имен ноутбуков. Выполните ячейку с %run? в ней для получения дополнительной информации.

Вы можете использовать ipython --script для сохранения ноутбуков также в виде файлов .py для каждого сохранения или раскомментации строки c.NotebookManager.save_script=True в вашем файле ipython_notebook_config.py для такого же эффекта (используйте ipython profile create для установки этого обновления Ubuntu конфигурационные файлы живут в ~/.config/ipython/).

Изменить: Следующее является истинным, но ненужным - вы можете напрямую %run a .ipynb. Спасибо Eric.

Если вы используете ipython magics в записной книжке, которую хотите импортировать, я обнаружил, что вы можете переименовать файл .py в .ipy (ipython script), но мне пришлось удалить первую строку (который содержит объявление кодировки файла), чтобы он работал. Вероятно, есть лучший способ! Этот подход, скорее всего, запутает клеточные магии (они все будут применены сразу).

Ответ 5

Существует также расширение "write and execute", которое позволит вам записать содержимое ячейки в файл (и заменить старый контент → код обновления), который затем можно импортировать в другой ноутбук.

https://github.com/minrk/ipython_extensions#write-and-execute

В одном блокноте (две ячейки)

%reload_ext writeandexecute
--
%%writeandexecute -i some_unique_string functions.py
def do_something(txt):
    print(txt)

И затем в другом ноутбуке:

from functions import do_something
do_something("hello world")

Ответ 6

Я вызываю ноутбуки из других ноутбуков. Вы даже можете передать "параметры" другим ноутбукам, используя следующий трюк:

Поместите params словарь в первую ячейку of report_template.ipynb.

params = dict(platform='iOS', 
              start_date='2016-05-01', 
              retention=7)
df = get_data(params ..)
do_analysis(params ..)

И в другом (более высоком логическом уровне) ноутбуке выполните его с помощью этой функции:

def run_notebook(nbfile, **kwargs):
    """
    example:
    run_notebook('report.ipynb', platform='google_play', start_date='2016-06-10')
    """

    def read_notebook(nbfile):
        if not nbfile.endswith('.ipynb'):
            nbfile += '.ipynb'

        with io.open(nbfile) as f:
            nb = nbformat.read(f, as_version=4)
        return nb

    ip = get_ipython()
    gl = ip.ns_table['user_global']
    gl['params'] = None
    arguments_in_original_state = True

    for cell in read_notebook(nbfile).cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

        if arguments_in_original_state and type(gl['params']) == dict:
            gl['params'].update(kwargs)
            arguments_in_original_state = False

run_notebook("report_template.ipynb", start_date='2016-09-01')

Эта команда будет выполнять каждую ячейку ноутбука "report_template" и переопределит соответствующие ключи словаря params , начиная со второй ячейки

Ответ 7

Итак, хорошая идея @MikeMuller будет работать на локальном ноутбуке, но не на удаленной (правда?). Я не думаю, что вы можете удаленно вызывать отдельные блоки ячеек или функции ipynb-кода на удаленном сервере и иметь возможность возвращать результаты обратно в свою программную программу, если только этот код не делает что-то довольно необычное для передачи результатов.

Я был в процессе написания, когда @Matt представила ту же идею о

ipython <URI_to_Notebook> --script

*.pynb - контейнер JSON, а не фактический python script. Вы можете заставить ipython экспортировать *.py с помощью

Если целевой *.ipynb находится на удаленном компьютере, который вы не контролируете, вам, вероятно, придется вытащить файл, чтобы вы могли записать вывод на локальный путь. (Не задумывались, можете ли вы вызывать это на удаленном ресурсе для создания локального вывода.) Как только это будет создано, вы сможете импортировать и запускать *.py или отдельные функции внутри него.

Вопрос для @Matt на этом аккуратном примере запуска другого файла .ipynb с опцией io.open(nbfile) заключается в том, может ли nbfile быть удаленным? Кажется, длинный выстрел, но будет здорово...

Ответ 8

Вот еще два совета:

  • Вы также можете запустить магию %qtconsole непосредственно из ноутбука, и она автоматически подключится к ядру ноутбука.

  • Отъезд https://github.com/atiasnir/ipnb

    Вы можете использовать его для импорта файлов ноутбуков, как если бы они были стандартными модулями python (я автор:-)). Основное ограничение здесь заключается в том, что он будет отбрасывать магические ячейки (потому что он вообще не использует IPython), но в остальном он должен работать нормально.

Ответ 9

Да, вы можете "запускать функции из одного ноутбука из другого (без вырезания и вставки их между разными ноутбуками)" - и, да, это легко сделать!

tl; dr: поместите код в файлы python (*.py) в файловую систему и пусть несколько ноутбуков используют один и тот же код. (Это так просто.)

(Зачем ставить так много кода в ноутбуках, когда у нас есть совершенно хорошие редакторы кода и IDE, которые намного лучше подходят для написания и чтения кода? Не говоря уже о необходимости правильного контроля версий! Что мы пытаемся достичь, и за какой счет? </rant>)

Детали:

  • Поместите свой код в обычные файлы python, например my_code/foo.py, добавив (возможно, пустой) my_code/__init__.py
  • Воспользуйтесь тем, что код под правильным контролем версии (например, git) - обратите внимание на то, как трудно было разделить файлы ipynb json?
  • Также поместите ноутбуки под контроль версий. Журналы Raw git будут трудно читать, но комментарии могут быть полезны. (GitHub/GitLab отображает ipython ноутбуки, кстати.)
  • Ограничьте источник py в ноутбуке ipynb небольшим количеством кода "драйвера", а также выведите и документацию.
  • Если вы хотите "встроить" внешние файлы python, просто используйте (например) magic %cat my_code/foo.py...

... Если вы хотите, чтобы что-то странное отображало этот источник inline (необязательно, добавив следующее к внешнему, повторно используемому исходному файлу)...

import IPython
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_for_filename

filename='my_code/foo.py'
with open(filename) as f: code = f.read()
formatter = HtmlFormatter(linenos='inline')
IPython.display.HTML('<style type="text/css">{}</style>{}'.format(
                formatter.get_style_defs('.highlight'),
                highlight(code, get_lexer_for_filename(filename), formatter)))

Ваши любимые редакторы кода и IDE благодарит вас за вашу поддержку.

Ответ 10

Я использую следующую функцию в записной книжке, из которой я хочу загрузить функции или действия из исходного ноутбука:

import io
import nbformat

def execute_notebook(nbfile):
    with io.open(nbfile, encoding="utf8") as f:
        nb = nbformat.read(f, as_version=4)

    ip = get_ipython()

    for cell in nb.cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

Используйте как:

execute_notebook(path/to/notebook.ipynb)