Запускать два приложения Python вместе? - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу создать приложение Python, в котором некоторые данные извлекаются и отображаются в приложении Dash.

Это часть Dash. Именно здесь все мои данные будут отправлены и показаны на веб-странице, так как я начинаю сейчас, это просто базовый пример графика в реальном времени.

import dash
from dash.dependencies import Output, Event
import dash_core_components as dcc
import dash_html_components as html
import plotly
import random
import plotly.graph_objs as go
from collections import deque

app = dash.Dash(__name__)
app.layout = html.Div(
    [
        dcc.Graph(id='live-graph', animate=True),
        dcc.Interval(
            id='graph-update',
            interval=1*1000
        ),
    ]
)

@app.callback(Output('live-graph', 'figure'),
              events=[Event('graph-update', 'interval')])
def update_graph_scatter():
    X.append(X[-1]+1)
    Y.append(Y[-1]+Y[-1]*random.uniform(-0.1,0.1))

    data = plotly.graph_objs.Scatter(
            x=list(X),
            y=list(Y),
            name='Scatter',
            mode= 'lines+markers'
            )

    return {'data': [data],'layout' : go.Layout(xaxis=dict(range=[min(X),max(X)]),
                                                yaxis=dict(range=[min(Y),max(Y)]),)}

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

Это часть Python, где данные извлекаются, подключаясь к веб-сокету.

import websocket
import json
from bitmex_websocket import Instrument
from bitmex_websocket.constants import InstrumentChannels
from bitmex_websocket.constants import Channels

websocket.enableTrace(True)

channels = [
    InstrumentChannels.trade,
]

XBTUSD = Instrument(symbol='XBTUSD',
                    channels=channels)
XBTUSD.on('action', lambda msg: test(msg))

XBTUSD = Instrument(symbol='XBTUSD',                       
                channels=channels)

XBTUSD.on('action', lambda msg: rekter(msg))

def rekter(msg):

    if msg['table'] =='trade':
        Rate = msg['data'][0]['price']

        print(Rate)


XBTUSD.run_forever()

Сейчас эта вторая часть должна отправлять только rate на график, но в будущем я надеюсь, что он будет обрабатывать намного больше данных каждую секунду, и я хотел бы работать с Pandas и Numpy для обработки эти данные.

Моя проблема в том, что я не знаю, как «встроить» мою вторую часть в первую часть. Я пытался это сделать, но если я поставлю строку XBTUSD.run_forever() перед app.run_server(debug=True), будет выполнена только одна часть кода, и все мое приложение Dash не запустится, пока я не остановлю первую часть кода. То же самое происходит, если я делаю обратное. Возможно ли, чтобы оба работали одновременно? Или мне просто искать другой путь?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Итак, здесь есть несколько фундаментальных недоразумений ...

Во-первых, вы почти наверняка НЕ ​​хотите пытаться писать отдельные сценарии (работающие в своем собственном процессе) для общения друг с другом. Это будет кошмар, если вы когда-нибудь захотите сделать что-нибудь полезное, и это действительно то, что следует учитывать после того, как обычные методы не работают. Причина в том, что межпроцессное взаимодействие сложно.

Во-вторых, вам нужно больше узнать о том, как работает импорт в python. Существует довольно много проблем с вашим импортом, и правильное понимание импорта в основном решит вашу проблему.

Для начала представьте, что ваши два файла Python находятся рядом друг с другом, вот так:

some_directory/
    __init__.py
    dash.py
    data.py

Так как они связаны друг с другом, вы можете импортировать одно в другое для обмена функциональными возможностями. Ваш код может выглядеть примерно так ...

dash.py

from .data import XBTUSD
# other imports

app = dash.Dash(__name__)
# dash display logic, etc...

# connect your data here
XBTUSD.run_forever()

С учетом вышесказанного вы бы хотели извлечь вызов XBTUSD.run_forever() из файла data.py, поскольку он просто определит команду, которую вы хотите выполнить, позволяя вызывать ее в другом месте и по-разному.

0 голосов
/ 06 ноября 2018

Возможно, вы не хотите «встраивать» его в первый. Насколько я могу судить, второе только «внедряет» данные в первое, так что нет логической необходимости их объединять, и с точки зрения архитектурного дизайна, связывание компонентов создает проблемы.

Я бы порекомендовал просто запустить два скрипта из вашей оболочки. И, конечно, вы можете использовать оболочку для запуска обоих сценариев, например

import subprocess

p = subprocess.Popen(['python', 'hello.py'])
p = subprocess.Popen(['python', 'wolrd.py'])

p.wait()
...