如何从异步函数返回值 [英] How to return value from async function

查看:118
本文介绍了如何从异步函数返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个异步函数,我试图从中获取返回变量,但由于某种原因我无法让它工作,我尝试了一些不同的谷歌搜索,但它们都返回了类似的错误.

I have an async function that I'm trying to get the return variable from but I'm not able to get it to work for some reason, I've tried a few different things from googling but theyre all returning a similar error.

我有这个功能:

@bot.command()
async def start(ctx):
    """starts the server"""
    try:
        status = server.status()
        await ctx.channel.send("The server is already online!")
    except:
        os.chdir(".\\Minecraft")
        file = subprocess.Popen("Start.bat")
        await ctx.channel.send("starting the server")
        starting = True
        while starting == True:
            time.sleep(int(delay))
            with open("outfile.txt") as outfile:
                for line in outfile:
                    if "Done" in line:
                        await ctx.channel.send("server has loaded")
                        starting = False
                        return file
                    else:
                        continue

然后我返回变量文件

但是当我尝试在另一个函数中获取变量时

But then when I try to get the variable in another function

@bot.command()
async def kill(ctx):
    """shuts down the server"""
    x = start(ctx)
    print(x)
    x.terminate()

我收到错误:

<coroutine object Command.__call__ at 0x040F7B28>
Ignoring exception in command kill:
Traceback (most recent call last):
  File "C:\Users\TheRi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 83, in wrapped
    ret = await coro(*args, **kwargs)
  File "c:/Users/TheRi/OneDrive/Desktop/Python/MinecraftDiscordBot/minecraftBot.py", line 113, in kill
    x.terminate()
AttributeError: 'coroutine' object has no attribute 'terminate'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\TheRi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\bot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\TheRi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 797, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\TheRi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 92, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'coroutine' object has no attribute 'terminate'
C:\Users\TheRi\AppData\Local\Programs\Python\Python38-32\lib\asyncio\events.py:81: RuntimeWarning: coroutine 'Command.__call__' was never awaited
  self._context.run(self._callback, *self._args)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

第一行似乎是我试图打印 x 的地方,看看我是否能看到发生了什么,剩下的就是错误.它似乎没有返回任何值,而只是返回协程本身?

The first line seems to be where I've attempted to print x, to see if I could see what was going on, and the rest is the error. It doesn't seem to be returning any value but just the co routine itself?

我尝试改变引用函数的方式,x = start(ctx),x = start(),x = start 等

I've tried changing the way I refrence the function, x = start(ctx),x = start(),x = start etc.

我做错了什么吗?我怎样才能返回变量.

Is there something I'm doing wrong? How can I return the variable.

推荐答案

你需要await协程;即 x = await start(ctx)

这篇关于如何从异步函数返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆