Python - 想要在它们都运行时将数据从一个脚本传递到另一个脚本

Posted

技术标签:

【中文标题】Python - 想要在它们都运行时将数据从一个脚本传递到另一个脚本【英文标题】:Python - Wanting to pass data from one script to another while they are both running 【发布时间】:2019-02-12 23:18:14 【问题描述】:

所以我正在制作一个 Discord Bot,当有人在 Twitch.tv 上直播时发布。目前我有一个运行机器人的 Python 程序和一个运行迷你服务器以从 Twitch 服务器(webhook)接收数据的程序。我不确定如何将从服务器接收到的数据传递给 discord 机器人。两个程序必须同时运行。

DiscordBot

import discord


client = discord.Client()




async def goes_live(data):
    print(data)
    print('Going Live')
    msg = '--- has gone live'
    await client.send_message(discord.Object(id='---'), msg)


@client.event
async def on_message(message):
    if message.author == client.user:
        return

    message.content = message.content.casefold()


@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')


client.run('---')

网络服务器

import web

urls = ('/.*', 'hooks')

app = web.application(urls, globals())


class hooks:

    def POST(self):
        data = web.data()
        print("")
        print('DATA RECEIVED:')
        print(data)
        print("")

        return 'OK'

    def GET(self):
        try:
            data = web.input()
            data = data['hub.challenge']
            print("Hub challenge: ", data)
            return data
        except KeyError:
            return web.BadRequest



if __name__ == '__main__':
    app.run()

【问题讨论】:

文档的相关部分:Interprocess Communication and Networking。请注意,discord.py 已经使用了asyncio,所以这可能是一个开始寻找的好地方。 您有 2 个选项: 1. 让您的 webhook 服务器发布不和谐消息。 2.(我不推荐使用这种方法,因为它使应用程序更难维护)使用redis/rabbitmq/等发布订阅。不要使用基于进程的方法,因为您将被限制在一台机器上。 【参考方案1】:

由于您的两个程序都在 python 中,并且如果它们相互关联足够大以至于它们总是一起运行,您可以简单地使用 multiprocessing 模块:让每个程序都作为 multiprocessing.Process 实例运行,并且给他们每个人一个multiprocessing.Pipe的一端,这样你就可以在进程之间交换信息。

架构看起来类似于 main.py:

# main.py
from multiprocessing import Process, Pipe
import program_1
import program_2

program_1_pipe_end, program_2_pipe_end = Pipe()

process_1 = Process(
    target = program_1.main,
    args = (program_1_pipe_end,)
    )

process_2 = Process(
    target = program_2.main,
    args = (program_2_pipe_end,)
    )

process_1.start()
process_2.start()
#Now they are running
process_1.join()
process_2.join()
# program_1.py and program_2.py follow this model

# [...]

# instead of if __name__ == '__main__' , do:
def main(pipe_end):
    # and use that pipe end to discuss with the other program
    pass

您可以找到Pipe documentation here,(在多处理文档中)。

【讨论】:

【参考方案2】:

如何使用 Flask 服务器来处理两个程序之间的通信。您可以定义能够获取数据并将其发送到 discord 脚本的自定义端点。

@app.route('/ep1', methods = ['GET','POST'])
def ep1():
    if request.method == 'POST':
        #do something for a POST request. 
    else:
        #do something for a GET request.

你可以使用这个结构来构建一些东西来监听变化,然后将它们发布到 discord bot。 您可能还需要考虑在 heroku 上托管此服务器

【讨论】:

将数据发送到 discord 机器人是问题所在,而您在此处掩饰了它。你到底打算怎么做?【参考方案3】:

机器人和迷你服务器是否在同一台机器上运行?在这种情况下,您只需让服务器将文件写入机器人可以访问和定期检查的位置。

【讨论】:

也许扩展你的答案来展示如何做到这一点。

以上是关于Python - 想要在它们都运行时将数据从一个脚本传递到另一个脚本的主要内容,如果未能解决你的问题,请参考以下文章

在运行应用程序时将数据写入 plist 并将它们读取到 UITable

Vue组件更改时将页脚保留在页面底部

仅在滚动到底部时将页脚固定到底部

如何通过xml文件导入时将图像连接到magento

仅在活动运行时将意图从服务发送到活动

想要在设备离线时将数据存储在本地数据库中,并在在线时从数据库中获取并发送到服务器