nonebot / aiocqhttp

A Python SDK with async I/O for CQHTTP (OneBot).
https://aiocqhttp.nonebot.dev
MIT License
280 stars 39 forks source link

如何在不同文件中使用同一个CQHTTP对象 #27

Closed SukiYume closed 4 years ago

SukiYume commented 4 years ago

现在我这边框架有三个文件 bot.py - 在里面有bot=CQHTTP()对象和

from test import testbot
@bot.on_message('private')
async def handle_msg(context):
    message = context['message']
    reply = testbot(message)
    await bot.send(reply)

test.py

async def testbot(content):
     await bot.send('123')
     return '发送成功'

run.py

from bot import bot
if __name__ == '__main__':
    bot.run()

直接在test文件中from bot import bot 会报错,Importerror,无法import bot 如果在test文件中import bot,在await bot.bot.send(),在运行的时候会报错RunTimeError, coroutine 'testbot' was never awaited

想请教一下如何在函数文件中使用同一个bot对象

ExerciseBook commented 4 years ago

没看懂。

如果只是单纯的调用 cqhttp 的 api 的话,那就可以随便操作。 如果是让 cqhttp 的事件上报转发给不同的 aiocqhttp 的话,可能需要 nginx 等手段代理一下?

SukiYume commented 4 years ago

没看懂。

如果只是单纯的调用 cqhttp 的 api 的话,那就可以随便操作。 如果是让 cqhttp 的事件上报转发给不同的 aiocqhttp 的话,可能需要 nginx 等手段代理一下?

不好意思,刚刚写完标题不小心敲了一下回车就直接发出去了,没写具体内容…现在补上了

ExerciseBook commented 4 years ago

bot=CQHTTP() 加这行就好

SukiYume commented 4 years ago

bot=CQHTTP() 加这行就好

如果test.py写成这样

#import bot
import asyncio
from aiocqhttp import CQHttp

bot=CQHttp()
async def testbot(context, content):
    reply = '1' + content
    await bot.send(context, reply)
    return '发送完了'

也会报同样的错… RuntimeWarning: coroutine 'testbot' was never awaited handle = None # Needed to break cycles when an exception occurs. RuntimeWarning: Enable tracemalloc to get the object allocation traceback

jqqqqqqqqqq commented 4 years ago

@SukiYume 我怀疑你需要重新学习一下asyncio怎么用?

jqqqqqqqqqq commented 4 years ago

@SukiYume 或者说有什么地方你忘了写await

SukiYume commented 4 years ago

@SukiYume 我怀疑你需要重新学习一下asyncio怎么用?

@jqqqqqqqqqq 您说的对,问题出在bot.py文件中,函数调用没给异步。

感谢各位。

jqqqqqqqqqq commented 4 years ago

@SukiYume 可以,找到问题就好说了,所有东西都得跑在loop里,和某些语言不一样