Печатать в консольный терминал, а не в вывод ячейки IPython Notebook

Я хотел бы печатать в окне терминала, в котором работает IPython Notebook, а не в выводе ячейки. Печать в выходные данные ячейки потребляет больше памяти и замедляет мою систему, когда я выполняю значительное количество вызовов print. По сути, я хотел бы, чтобы это поведение было задумано.

Я пробовал следующее:

  1. Я пробовал разные перестановки вызовов print и sys.stdout.write
  2. Я просмотрел документацию по блокноту IPython здесь, здесь и здесь без посторонней помощи
  3. Я попытался использовать это в качестве обходного пути, но, похоже, это только работаю на питоне 2.7

person Matt    schedule 09.06.2015    source источник


Ответы (3)


Вы должны перенаправить свой вывод на стандартное устройство вывода системы. Это зависит от вашей ОС. На Mac это будет:

import sys
sys.stdout = open('/dev/stdout', 'w')

Введите приведенный выше код в ячейку IPython и оцените его. После этого все выходные данные будут отображаться в терминале.

person MaxPowers    schedule 09.06.2015
comment
Есть ли способ обратить это вспять? и восстановить ipython stdout - person Frederic Bazin; 21.07.2015
comment
Вы могли бы, например. сохраните ссылку на блокнот stdout перед перенаправлением: nb_stdout = sys.stdout. Теперь вы должны перенаправить вывод. Чтобы вернуться к выходным данным записной книжки, просто напишите: sys.stdout = nb_stdout. Более чистым решением было бы использовать contextlib.redirect_stdout(new_target) Менеджер контекста. - person MaxPowers; 21.07.2015
comment
@MaxPowers Знаете ли вы, что нужно писать в Windows? - person Yaeli778; 22.02.2016
comment
@MaxPowers: обратите внимание, что contextlib.redirect_stdout работает только в python 3.4 и выше. - person hlin117; 09.03.2016
comment
Благодаря вам я могу sys.stderr = open('/dev/stderr', 'w'); но как мне сделать это доступным для Windows? - person Polv; 17.10.2018
comment
@MaxPowers В моем случае я запускаю подпроцесс, и вывод отправляется на терминал, а не на ноутбук. Любые идеи? - person innuendo; 11.02.2019

В Windows это может работать:

import sys
sys.stdout = open(1, 'w')
person wxxwxa    schedule 07.12.2017
comment
Эй, вы скопировали ответ @MaxPowers и опубликовали - person Dilip; 07.12.2017
comment
А как насчет sys.stderr? - person Polv; 17.10.2018

Чтобы можно было легко переключаться с одной формы на другую:

terminal_output = open('/dev/stdout', 'w')

print('this will show up in the IPython cell output')
print('this will show up in the terminal', file=terminal_output)

Точно так же terminal_error = open('/dev/stderr', 'w') можно использовать для отправки на терминал stderr без каких-либо конфликтов с поведением по умолчанию sys.stderr (которое заключается в печати сообщения об ошибке в выводе ячейки IPython).

person fonini    schedule 21.04.2020