【问题标题】:create_task = asyncio.async: SyntaxError: 无效语法
【发布时间】:2018-12-14 05:55:05
【问题描述】:

我正在为 Discord 创建一个机器人,我刚刚编写了这个简单的代码:

import discord

TOKEN = "token"

client = discord.Client()


@client.event
async def on_ready():
    print('Bot is ready.')


client.run(TOKEN)

它会产生以下错误:

Traceback (most recent call last):
  File "/Users/pcaires/Desktop/Programação/Python/Discord Bots/Main.py", line 1, in <module>
    import discord
  File "/Users/pcaires/Desktop/Programação/Python/Discord Bots/venv/lib/python3.7/site-packages/discord/__init__.py", line 20, in <module>
    from .client import Client, AppInfo, ChannelPermissions
  File "/Users/pcaires/Desktop/Programação/Python/Discord Bots/venv/lib/python3.7/site-packages/discord/client.py", line 38, in <module>
    from .state import ConnectionState
  File "/Users/pcaires/Desktop/Programação/Python/Discord Bots/venv/lib/python3.7/site-packages/discord/state.py", line 36, in <module>
    from . import utils, compat
  File "/Users/pcaires/Desktop/Programação/Python/Discord Bots/venv/lib/python3.7/site-packages/discord/compat.py", line 32
    create_task = asyncio.async
                              ^
SyntaxError: invalid syntax

我在网上搜了又搜,大部分人都说用Python 3.7,我一直在用的就是这个。另外,我一直使用 PyCharm 作为我的 Python IDE。

【问题讨论】:

  • 我建议从脚本中删除您的令牌,因为这意味着任何人都可以控制您的机器人。我还会生成一个新令牌,甚至创建一个新机器人。
  • 此问题不再与 discord.py 相关,如果您有指向 async def 的无效语法错误,请参阅此帖子:stackoverflow.com/questions/43948454/…

标签: discord discord.py


【解决方案1】:

错误从何而来?

您使用的 discord.py 版本不支持 Python 3.7(其中async 成为保留关键字),如this issue 中所述。 这个版本的 discord.py 是 GitHub repo 上的默认分支,遗憾的是 Pip 安装的那个。

如何解决

您可以:

  • 将您的 Python 版本降级到 3.6。
  • 安装另一个版本的 discord.py,基于 rewrite branch正在积极开发中,例如使用命令:python3 -m pip install --user -U https://github.com/Rapptz/discord.py/archive/rewrite.zip

【讨论】:

    【解决方案2】:

    您可以手动编辑文件并将该行从 create_task = asyncio.async 更改为 create_task = getattr(asyncio, 'async')

    在此处查看更多信息:https://github.com/Rapptz/discord.py/issues/1249

    【讨论】:

    • 我认为该链接中更相关的建议是更新到与 python 3.7 兼容的discord.py 的更新版本
    • 这不是一个好的(实际上是一个糟糕的)建议。首先,您不应该手动更改站点包源文件,它会使您的代码依赖于更改后的需求包。其次,asyncio.async 在以前的版本中已被弃用,因此如果您要推荐修复,请将其更改为未弃用的内容。第三,显然有更好的解决方案选择,请参阅 Patrick 的评论(这个问题有一个半官方补丁 - 虽然补丁就像您的评论,但我不相信它会传递给官方版本,请参阅前两点)。
    • 我尝试按照您的回答进行操作,但我从其他地方收到了更多类似的错误。最后我使用了上面的答案。现在可以正常使用了
    【解决方案3】:

    在您的要求中添加 asyncio,它已经在 Python 中(自 3.5 起)。

    It is only relevant for Python 3.3, which does not include asyncio in its stdlib.

    【讨论】:

      【解决方案4】:

      作为快速修复,您可以在已安装的违规模块中将 asyncio.async 更改为 asyncio.ensure_future 并运行它。显然,正确的做法是更新模块,但如果不可能,上述方法将使其再次运行。

      【讨论】:

        猜你喜欢
        • 2015-09-08
        • 1970-01-01
        • 2013-12-19
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多