簡體   English   中英

無法在里面運行我的Python腳本

[英]Can't run my Python script with two functions inside

我想創建一個Python應用程序,其中一些數據被檢索並在Dash應用程序上繪制圖表。

這是Dash部分。 這是我的整個數據將被發送並顯示在網頁上的地方,因為我現在開始,這只是一個實時圖表的基本示例。

main.py

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部分,連接到Websocket。
data.py

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()

我試圖通過使用導入來實現這一點,所以我作為模塊導入了我的腳本,但這也不起作用:

from trades import XBTUSD
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


X = deque(maxlen=2000)
X.append(1)
Y = deque(maxlen=2000)
Y.append(1)


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)

XBTUSD.run_forever()

除此之外,我嘗試將其轉換為模塊,但它也沒有用。

我的問題是我不知道如何將第二部分“嵌入”第一部分。 我嘗試過這樣做,但是如果我在app.run_server(debug=True) XBTUSD.run_forever()之前app.run_server(debug=True) XBTUSD.run_forever()行,則只會執行一部分代碼並且我的整個Dash應用程序將不會運行直到我停止第一部分編碼。 如果我做相反的事情也會發生相同

所以問題是XBTUSD.run_forever() ,但我不能刪除該行,因為它不會運行data.py。 有辦法解決這個問題嗎?

我現在想要運行兩個獨立的腳本,一個發送數據到一個數據庫,另一個應該查詢數據庫,檢索數據並繪制圖表,但我不知道它是否是最好的解決方案,因為a)我將是每分鍾處理大量數據b)我不知道在線部署時是否可行(例如,在heroku上

答案是threading或多multiprocessing ,這將允許兩種方法同時運行。 對可變對象的更改發生在兩個線程/進程中,因此您可以在兩個函數之間進行通信。 這篇文章提供了明確的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM