Программно получить текущий выход Ipython ноутбука?

У меня есть импортированная функция, которая работает в ноутбуке IPython (входная ячейка X), которая производит вывод (в выходной ячейке X). После запуска функции у меня есть еще один код (также во входной ячейке X); есть ли способ для этого кода получить текущий вывод (в выходной ячейке X)?

Могут быть другие способы делать то, что я пытаюсь достичь; но мне любопытно, если это возможно.

Благодарю!

Ответ 1

Система кэширования вывода IPython определяет несколько глобальных переменных:

  • [ _ ] (один символ подчеркивания): сохраняет предыдущий вывод, например интерпретатор по умолчанию Pythons.
  • [ __ ] (два символа подчеркивания): следующий предыдущий.
  • [ ___ ] (три символа подчеркивания): следующий-следующий предыдущий.

Кроме того, после каждого выхода x создается переменная _<x> созданная с выходом в качестве ее значения. Например:

In [12]: lst = [i for i in range(11)]

In [13]: lst
Out[13]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

In [14]: _13
Out[14]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Кроме того, если вам интересно, _i<x> содержит содержимое входной ячейки x:

In [15]: _i12
Out[15]: 'lst = [i for i in range(11)]'

Ответ 2

Вы можете получить вывод ячейки X с помощью _ или Out[X]. Такие как:

In [1]: 2 + 35
Out[1]: 37
In [2]: _ + 3
Out[2]: 40 
In [3]: lst = [i for i in range(5)]
        lst
Out[3]: [0, 1, 2, 3, 4]
In [4]: Out[1] #Using the output of Cell 1
Out[4]: 37
In [5]: Out[3][1] #Using the output of Cell 3
Out[5]: 1

Здесь, если вы хотите получить выходные данные предыдущей ячейки, вы можете использовать _. Вы можете использовать два (__) или три символа подчеркивания (___), а также ссылаться на выходные данные следующих предыдущих и следующих следующих предыдущих ячеек соответственно.

Однако, если у вас много ячеек в записной книжке, и вы хотите передать какую-то определенную ячейку, тогда будет полезен Out[X].

Ответ 3

Существующие ответы не работают, когда ячейка вызывает функцию, которая генерирует свой собственный стандартный stdout.

Я нашел другое решение, которое улавливает все выходные данные предыдущей ячейки, независимо от того, как она была получена.

# cell 1:
%%capture output
print("blah")
func_that_prints("Bha")
# -----------------
# cell 2:
prev_cell_output = str(output)
# do something with prev_cell_output

Обратите внимание, что для %%capture строки %%capture должна быть самая первая строка ячейки. output может быть переименован в любое другое имя переменной. Там не будет никакого вывода для первой отображаемой ячейки (поскольку она будет захвачена).

output становится доступным только в следующей ячейке. Это объект utils.io.CapturedIO, поэтому вы можете его .show() или даже вызвать .show(), чтобы отобразить его содержимое.

Для получения дополнительной информации, например, захват просто stdout или просто stderr используйте ссылку.