Plotly / Dash - Python, как остановить выполнение через раз? - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу остановить выполнение моей Dash-программы через определенное время (даже лучше, когда я закрываю окно браузера, хотя сомневаюсь, что это возможно).Есть ли способ прервать его через python?

Я уже пытался поставить

sys.exit() 

после вызова app.run_server.Насколько я понимаю,

app.run_server

находится в бесконечном цикле, поэтому я никогда не достигаю sys.exit ()

if __name__ == '__main__':
    app.title = 'foo'
    app.run_server(debug=False)
    sys.exit("Bye!")

1 Ответ

0 голосов
/ 10 апреля 2019

Поскольку plotly использует flask для сервера.Таким образом, ваш код sys.exit("Bye!") фактически никогда не достигается, поэтому ваш сервер никогда не останавливается.Таким образом, есть 2 способа остановить ваш сервер,

  • Ctrl + c, который, как я полагаю, вы будете делать сейчас

  • Теперь вы можете сделать этоиспользуя код тоже, так что если вам действительно нужно остановить код через некоторое время, вы должны остановить колбу сервера.Чтобы остановить флеш-сервер, вам нужно создать маршрут.Поэтому, когда вы нажмете этот URL, сервер остановится.

Ниже приведен код для Flask, вам необходимо преобразовать его в эквивалентный кодовый код:

from flask import request

def shutdown_server():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()

Теперь вы можете выключить сервер, вызвав эту функцию:

@app.route('/shutdown', methods=['POST'])
def shutdown():
    shutdown_server()
    return 'Server shutting down...'

Обновление: Для графика вы можете написать код следующим образом.

import dash
import dash_core_components as dcc
import dash_html_components as html
from flask import request

print(dcc.__version__) # 0.6.0 or above is required

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    # represents the URL bar, doesn't render anything
    dcc.Location(id='url', refresh=False),

    dcc.Link('Navigate to "/"', href='/'),
    html.Br(),
    dcc.Link('Navigate to "/page-2"', href='/page-2'),

    # content will be rendered in this element
    html.Div(id='page-content')
])

def shutdown():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()

@app.callback(dash.dependencies.Output('page-content', 'children'),
              [dash.dependencies.Input('url', 'pathname')])
def display_page(pathname):
    if pathname =='/shutdown':
        shutdown()
    return html.Div([
        html.H3('You are on page {}'.format(pathname))
    ])


if __name__ == '__main__':
    app.run_server(debug=True)
...