Как сделать так, чтобы вывод ipywidget захватывал только стандартный вывод? - PullRequest
0 голосов
/ 15 февраля 2020

I w * sh для захвата вывода stdout из функции, чтобы при первом вызове этой функции ее вывод нормально отображался в записной книжке i Python, но при повторном вызове ее вывод перезапишет предыдущий вывод. (Так что предыдущий вывод будет очищен, а новый вывод показан в том же месте)

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

Вот минимальный (не) рабочий пример кода, который у меня есть:

import sys
from ipywidgets import widgets
from IPython.display import display, clear_output

# This function is in some library and cannot be changed
def black_box(iter):
    print('Some output to stdout {}.'.format(iter)) #This is supposed to be cleared on each function call
    sys.stderr.write('Some output to stderr {}.'.format(iter)) #This is NOT supposed to be cleared on each function call

print('Some other output that is not supposed to be cleared.')

output = widgets.Output()
display(output)

with output: # I need this to capture only stdout, not stderr ...
    black_box(1)

print('Some other output that is not supposed to be cleared.')

with output:
    clear_output() # ... so that this line clears only stdout, not stderr
    black_box(2)

Вывод выглядит так:

Some other output that is not supposed to be cleared.
Some output to stdout 2.
Some output to stderr 2.
Some other output that is not supposed to be cleared.

Как я sh вывод будет выглядеть так:

Some other output that is not supposed to be cleared.
Some output to stdout 2.
Some output to stderr 1.
Some output to stderr 2.
Some other output that is not supposed to be cleared.

Как видите, вывод stderr также был захвачен и очищен на втором вызове функции. Кто-нибудь знает способ обойти это? Спасибо.

1 Ответ

0 голосов
/ 03 марта 2020

Вы пробовали я python магию ? Имеются варианты, такие как --no-stderr и --no-stdout

...