一起运行两个Python应用程序?
我想创建一个Python应用程序,其中一些数据被检索并在Dash应用程序上绘制图表 这是破折号部分。这是我的全部数据将被发送并显示在网页上的地方,因为我现在开始,这只是一个实时图表的基本示例一起运行两个Python应用程序?,python,python-3.x,plotly-dash,Python,Python 3.x,Plotly Dash,我想创建一个Python应用程序,其中一些数据被检索并在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 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
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()
现在,第二部分应该只发送<代码>速率代码>到图表,但在未来,我希望它每秒处理更多的数据,我希望与Pandas和Numpy一起处理这些数据
我的问题是,我不知道如何将我的第二部分“嵌入”到第一部分中。我尝试过这样做,但如果我在
app.run\u server(debug=True)
之前加上XBTUSD.run\u ever()
,则只会执行代码的一部分,而我的整个Dash应用程序在停止代码的第一部分之前不会运行。如果我做相反的事情,同样的情况也会发生。有可能同时运行这两个程序吗?或者我应该寻找另一种方法吗?您可能不想将其“嵌入”到第一种方法中。据我所知,第二个只向第一个“注入”数据,因此不需要将它们放在一起,从架构设计的角度来看,耦合组件会带来麻烦
我建议从shell中运行两个脚本。当然,您可以使用包装器用一个脚本启动这两个脚本,如
import subprocess
p = subprocess.Popen(['python', 'hello.py'])
p = subprocess.Popen(['python', 'wolrd.py'])
p.wait()
所以这里有一些基本的误解 首先,您几乎肯定不想尝试编写单独的脚本(在它们自己的进程中运行)来相互通信。如果你想完成任何有用的事情,那将是一场噩梦,而且在传统方法无法实现之后,这确实是一件应该考虑的事情。原因是,进程间通信很困难 其次,您需要进一步了解python中导入的工作原理。您的进口产品存在很多问题,正确理解进口产品基本上可以解决您的问题 首先,假设您的两个python文件彼此相邻,如下所示:
some_directory/
__init__.py
dash.py
data.py
因为它们是相对的,所以可以将一个导入另一个以共享功能。您的代码可能最终看起来像这样
短跑
from .data import XBTUSD
# other imports
app = dash.Dash(__name__)
# dash display logic, etc...
# connect your data here
XBTUSD.run_forever()
有了以上内容,您可能希望从
data.py
文件中调用XBTUSD.run_forever()
,因为它将简单地定义您要运行的命令,允许您在其他地方以不同的方式调用它。那么,使用子流程是否可以让我在两个脚本之间“共享”数据、变量等?这听起来是一个很好的解决方案,但一旦部署并准备好在网站上运行,它是否能够很好地扩展?对不起,我对这个还不太熟悉!非常感谢。否,子流程将不允许您按自己的意愿共享数据。线程可以,但线程和进程都不应该成为您的解决方案的一部分。简单的导入将解决您的问题。如果您有兴趣了解有关进程生成的更多信息,请查看以下链接:。线程也很有趣,但同样不是这里的最佳解决方案。谢谢!也许我还应该考虑使用DB来“共享”数据,这样能让我将变量/数据从data.py转换到dash.py吗?我试过了,但没有得到名为“main.trades”的模块,谢谢你的建议!查找main.trades
模块时出现导入错误。您使用的代码是最新的吗?我没有看到任何与交易相关的导入。抱歉,交易是您调用的文件的真实名称。数据!啊,那么这个链接可能会有帮助。它解释了如何在python中进行相对导入。通读整本书,这是一本很好的入门书。谢谢,我来看看!