Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python脚本之间传递值(数据)?_Python_Discord.py_Python Asyncio_Python Multiprocessing_Pyside6 - Fatal编程技术网

如何在python脚本之间传递值(数据)?

如何在python脚本之间传递值(数据)?,python,discord.py,python-asyncio,python-multiprocessing,pyside6,Python,Discord.py,Python Asyncio,Python Multiprocessing,Pyside6,在两个不同的python脚本之间通信(传递字符串)的正确方式是什么 我有一个ui.py脚本,它利用PySide6生成GUI,还有一个bot.py脚本,它监听不和谐/电报对话,并使用异步函数捕获一些关键字。两个脚本位于同一目录中 我已将我的bot.py文件中的Asyncio事件循环代码放入名为runscript()的函数中,并使用ui.py中的multiprocessing.Process在单击PySide6 QPushButton后运行该函数 所以这里的问题是,我想在我的GUI中显示关键字bot

在两个不同的python脚本之间通信(传递字符串)的正确方式是什么

我有一个ui.py脚本,它利用PySide6生成GUI,还有一个bot.py脚本,它监听不和谐/电报对话,并使用异步函数捕获一些关键字。两个脚本位于同一目录中

我已将我的bot.py文件中的Asyncio事件循环代码放入名为runscript()的函数中,并使用ui.py中的multiprocessing.Process在单击PySide6 QPushButton后运行该函数

所以这里的问题是,我想在我的GUI中显示关键字bot.py,所以我需要将该字符串传递给ui.py(将来需要以另一种方式传递字符串,从ui.py传递到bot.py),但我不知道如何做到这一点。我已经尝试过多处理.Pipe,但这会阻塞我的代码,因为当新消息到达时(使用Asyncio),脚本会从discord/电报中获取消息,我迫不及待地想这样做

#bot.py

# do other stuff above here
@discord_client.event
async def on_message(message):
    if message.channel.id in discord_channel_list:
        discord_message = message.content
        selected_symbol = message_analyzer(discord_message)
        print(selected_symbol)

async def discord_connection():
    await discord_client.start(discord_token)

def runscript():
    connection = asyncio.get_event_loop()
    connection.create_task(binance_connection())
    connection.create_task(discord_connection())
    connection.create_task(telegram_connection())
    connection.create_task(connection_check())

    try:
        connection.run_forever()
    except KeyboardInterrupt:
        print("\nShutting down...")
    except:
        print("\nWARN! Shutting down...")
例如,我需要获取所选_符号的值并将其传输到ui.py

#ui.py

import bot

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.start_button = QPushButton("Start")
        self.start_button.clicked.connect(self.run)

    def run(self):
        bot_process = Process(target=bot.runscript)
        bot_process.daemon = True
        bot_process.start()
实现这一目标的正确方法是什么?提前感谢。

一般来说,Qt不是进程安全的,因此您不应该从其他进程更新GUI。另一种方法是创建一个QThread(或threading.Thread),它只解析队列的信息,并发出一个包含更新GUI信息的信号。另一个选项是使用执行上述操作的QTimer:监视队列

class Worker(QObject):
    messageChanged = Signal(str)

def monitoring(p, worker):
    while True:
        try:
            msg = p.recv()
        except EOFError:
            break
        else:
            worker.messageChanged.emit(msg)
但是使用多处理会增加不必要的复杂性,相反,您可以使用(
python-m pip install qasync
)然后使用asyncio:

导入异步IO
从functools导入缓存的_属性
导入系统
进口不和
从PySide6导入QtCore、QtWidgets
从qasync导入QEventLoop,异步插槽
类DiscordManager(QtCore.QObject):
已连接=QtCore.Signal()
断开连接=QtCore.Signal()
messageChanged=QtCore.Signal(discord.message.message)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.client.event(self.on_消息)
self.client.event(self.on_connect)
self.client.event(self.on\u断开连接)
@缓存的不动产
def客户端(自身):
返回discord.Client()
_消息上的异步定义(self,message):
self.messageChanged.emit(消息)
异步def启动(自):
等待self.client.start(
""
)
异步def关闭(自):
等待self.client.close()
_connect上的异步定义(自):
self.connected.emit()
断开连接时的异步定义(自):
self.disconnected.emit()
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.button=qtwidts.QPushButton(“开始”)
self.label=qtwidts.QLabel(alignment=QtCore.Qt.AlignCenter)
central_widget=qtwidts.QWidget()
lay=qtwidts.QVBoxLayout(中心小部件)
lay.addWidget(self.button)
lay.addWidget(self.label)
self.setCentralWidget(中心窗口小部件)
self.button.clicked.connect(self.handle_clicked)
self.manager.connected.connect(self.handle\u connected)
self.manager.disconnected.connect(self.handle\u disconnected)
self.manager.messageChanged.connect(self.handle\u message)
@缓存的不动产
def经理(自我):
返回DiscordManager()
@异步插槽()
已单击异步定义句柄(自):
如果self.button.text()=“开始”:
等待self.manager.start()
其他:
等待self.manager.close()
def句柄_消息(自我,消息):
self.label.setText(message.content)
def手柄_已连接(自):
self.button.setText(“停止”)
def手柄_已断开(自):
self.button.setText(“开始”)
def main():
app=qtwidts.QApplication(sys.argv)
循环=QEventLoop(应用程序)
asyncio.set\u event\u循环(循环)
w=主窗口()
w、 show()
loop.run_forever()
如果名称=“\uuuuu main\uuuuuuuu”:
main()

现在尝试了这个方法,效果很好,但是我需要在按下GUI上的按钮时启动()discord.Client,而不是在脚本初始化时启动。有可能做这样的事吗?如果是这样的话,这对我来说是个好的开始。在这之后,我需要对telethon做同样的事情,并实现其他方法,如消息分析器。@AlperenÖztürk用它更新示例functionality@AlperenÖztürk这是另一个问题,所以你必须创建另一个帖子。如果您不知道这些规则,请阅读并检查,在这里我们解决具体问题,我们不会在项目中指导任何人,因为这是一项太多的任务,我们也不会实施问题中没有的内容。我们当然不会做你所有的训练,我没有那样的目的。对不起,我缺乏知识。我对stackoverflow和这个社区的工作方式还不熟悉。删除了评论。@AlperenÖztürk正是为了避免此类讨论或制造此类借口,我为您提供了我希望您在发布新帖子之前阅读的链接。另外,如果您可以阅读,使用关系数据库(如sqlite)是否有效?我不确定。我最终将两个代码合并成一个.py文件并使用qasync。
r, w = Pipe(duplex=False)
p = Process(target=foo, args=(w,))

worker = Worker()
worker.messageChanged.connect(self.some_slot)

threading.Thread(target=monitoring, args=(r, worker), daemon=True).start()
p.start()