一起运行两个Python应用程序?

一起运行两个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

我想创建一个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 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中进行相对导入。通读整本书,这是一本很好的入门书。谢谢,我来看看!