Plotly / Dash — Python, как остановить выполнение по истечении времени?

Я хочу остановить выполнение моей программы 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!")
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
12 487
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

  • Теперь вы также можете сделать это с помощью кода, поэтому, если вам действительно нужно остановить код через некоторое время, вы должны остановить сервер flask. Чтобы остановить фляжный сервер, вам нужно создать маршрут. Поэтому всякий раз, когда вы нажимаете этот 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)

Спасибо за быстрый ответ, однако я получаю следующую ошибку AttributeError: объект «Dash» не имеет атрибута «маршрут».

wieli99 10.04.2019 22:26

Извините, я дал вам синтаксис для фляги. Вам нужно преобразовать код в сюжетный тире.plot.ly/urls

argo 10.04.2019 22:28

Спасибо за обновление, я использовал что-то подобное, но теперь у меня есть кнопка отмены и стрелка обновления на моей странице, знаете почему?

wieli99 10.04.2019 23:00

@wieli99 Не уверен. Но я думаю, что ваша первая проблема теперь решена. вы можете закрыть приложение.

argo 10.04.2019 23:03

Для будущих читателей: добавьте ._dash-undo-redo { display: none; } в ваш внешний css, чтобы исправить это

wieli99 10.04.2019 23:22
def button():
        button_reply = QMessageBox.question(MainWindow, "Bank Management System", "Deposited Successfully", QMessageBox.Ok)
        if button_reply == QMessageBox.Ok:
            Deposit()//execute deposite function first
            threading.Timer(5.0,clearData).start()// clrarData function will execute after 5 seconds

Другие вопросы по теме