Программно получить текущий выход 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
используйте ссылку.