将 Python 的控制台输出重定向到 Dash
Redirecting Python's console output to Dash
如何 redirect/show 控制台输出(包括我在程序中打印的输出),以便它出现在 Dash 应用程序中(在用户看到的屏幕上)?
一种可能的方法是将其作为 Dash 核心组件文本区域值 属性 的输入提供。如果它是一个字符串,这应该可以工作。
我没有找到让 Dash 直接读取控制台输出的方法,所以我使用了一个使用文本文件的解决方法。
这是将控制台输出的最后 20 行打印到 Iframe 的示例代码(为了保留换行符,其他 text/div 组件中不会显示):
import dash_core_components as dcc
import dash_html_components as html
import dash
import sys
f = open('out.txt', 'w')
f.close()
app = dash.Dash()
app.layout = html.Div([
dcc.Interval(id='interval1', interval=1 * 1000,
n_intervals=0),
dcc.Interval(id='interval2', interval=5 * 1000,
n_intervals=0),
html.H1(id='div-out', children=''),
html.Iframe(id='console-out',srcDoc='',style={'width':
'100%','height':400})
])
@app.callback(dash.dependencies.Output('div-out',
'children'),
[dash.dependencies.Input('interval1', 'n_intervals')])
def update_interval(n):
orig_stdout = sys.stdout
f = open('out.txt', 'a')
sys.stdout = f
print 'Intervals Passed: ' + str(n)
sys.stdout = orig_stdout
f.close()
return 'Intervals Passed: ' + str(n)
@app.callback(dash.dependencies.Output('console-out',
'srcDoc'),
[dash.dependencies.Input('interval2', 'n_intervals')])
def update_output(n):
file = open('out.txt', 'r')
data=''
lines = file.readlines()
if lines.__len__()<=20:
last_lines=lines
else:
last_lines = lines[-20:]
for line in last_lines:
data=data+line + '<BR>'
file.close()
return data
app.run_server(debug=False, port=8050)
创建一个custom LoggerHandler, and use dcc.Interval
用于刷新。
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import dash
import logging
class DashLoggerHandler(logging.StreamHandler):
def __init__(self):
logging.StreamHandler.__init__(self)
self.queue = []
def emit(self, record):
msg = self.format(record)
self.queue.append(msg)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
dashLoggerHandler = DashLoggerHandler()
logger.addHandler(dashLoggerHandler)
app = dash.Dash()
app.layout = html.Div([
dcc.Interval(id='interval1', interval=5 * 1000, n_intervals=0),
html.H1(id='div-out', children='Log'),
html.Iframe(id='console-out',srcDoc='',style={'width': '100%','height':400})
])
@app.callback(
Output('console-out', 'srcDoc'),
Input('interval1', 'n_intervals'))
def update_output(n):
return ('\n'.join(dashLoggerHandler.queue)).replace('\n', '<BR>')
app.run_server(debug=False, port=8050)
如何 redirect/show 控制台输出(包括我在程序中打印的输出),以便它出现在 Dash 应用程序中(在用户看到的屏幕上)?
一种可能的方法是将其作为 Dash 核心组件文本区域值 属性 的输入提供。如果它是一个字符串,这应该可以工作。
我没有找到让 Dash 直接读取控制台输出的方法,所以我使用了一个使用文本文件的解决方法。 这是将控制台输出的最后 20 行打印到 Iframe 的示例代码(为了保留换行符,其他 text/div 组件中不会显示):
import dash_core_components as dcc
import dash_html_components as html
import dash
import sys
f = open('out.txt', 'w')
f.close()
app = dash.Dash()
app.layout = html.Div([
dcc.Interval(id='interval1', interval=1 * 1000,
n_intervals=0),
dcc.Interval(id='interval2', interval=5 * 1000,
n_intervals=0),
html.H1(id='div-out', children=''),
html.Iframe(id='console-out',srcDoc='',style={'width':
'100%','height':400})
])
@app.callback(dash.dependencies.Output('div-out',
'children'),
[dash.dependencies.Input('interval1', 'n_intervals')])
def update_interval(n):
orig_stdout = sys.stdout
f = open('out.txt', 'a')
sys.stdout = f
print 'Intervals Passed: ' + str(n)
sys.stdout = orig_stdout
f.close()
return 'Intervals Passed: ' + str(n)
@app.callback(dash.dependencies.Output('console-out',
'srcDoc'),
[dash.dependencies.Input('interval2', 'n_intervals')])
def update_output(n):
file = open('out.txt', 'r')
data=''
lines = file.readlines()
if lines.__len__()<=20:
last_lines=lines
else:
last_lines = lines[-20:]
for line in last_lines:
data=data+line + '<BR>'
file.close()
return data
app.run_server(debug=False, port=8050)
创建一个custom LoggerHandler, and use dcc.Interval
用于刷新。
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import dash
import logging
class DashLoggerHandler(logging.StreamHandler):
def __init__(self):
logging.StreamHandler.__init__(self)
self.queue = []
def emit(self, record):
msg = self.format(record)
self.queue.append(msg)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
dashLoggerHandler = DashLoggerHandler()
logger.addHandler(dashLoggerHandler)
app = dash.Dash()
app.layout = html.Div([
dcc.Interval(id='interval1', interval=5 * 1000, n_intervals=0),
html.H1(id='div-out', children='Log'),
html.Iframe(id='console-out',srcDoc='',style={'width': '100%','height':400})
])
@app.callback(
Output('console-out', 'srcDoc'),
Input('interval1', 'n_intervals'))
def update_output(n):
return ('\n'.join(dashLoggerHandler.queue)).replace('\n', '<BR>')
app.run_server(debug=False, port=8050)