【问题标题】:Redirecting Python's console output to Dash将 Python 控制台输出重定向到 Dash
【发布时间】:2018-08-28 12:09:24
【问题描述】:

如何重定向/显示控制台输出(包括我在程序中打印的输出),以便它出现在 Dash 应用程序中(在用户看到的屏幕上)?

【问题讨论】:

    标签: python plotly plotly-dash


    【解决方案1】:

    我没有找到让 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)
    

    【讨论】:

      【解决方案2】:

      一种可能的方法是将其作为输入提供给 Dash 核心组件文本区域的 value 属性。如果它是一个字符串,这应该可以工作。

      【讨论】:

        【解决方案3】:

        创建一个custom LoggerHandler,并使用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)
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多