【问题标题】:Python [Invalid syntax] with async def带有 async def 的 Python [无效语法]
【发布时间】:2021-09-07 20:11:21
【问题描述】:

我正在尝试使用 Python 编写不和谐的机器人,我遇到了这个机器人并将其拼凑在一起。

import discord
import asyncio
import random

client = discord.Client()
inEmail = input("Email:")
inPassword = input("Passwd:")

async def background_loop():
    await client.wait_until_ready()
    while not client.is_closed:
        channel = client.get_channel("************")
        messages = ["Hello!", "How are you doing?", "Testing!!"]
        await client.send_message(channel, random.choice(messages))
        await asyncio.sleep(120)

client.loop.create_task(background_loop())
client.run(inEmail, inPassword)

然而,当我尝试运行它时,我收到了SyntaxError

File "1.py", line 7
  async def background_loop():
     ^
SyntaxError: invalid syntax

这是为什么呢?在我测试它之前,我从未收到过它。

【问题讨论】:

  • 在函数定义前使用 async 仅在 Python 3.4 或更高版本中有效。
  • 是的,我一直在使用“python3 1.py”运行脚本
  • 我明白了,所以 python 3.4 以上的任何东西都应该工作吗?这真的很奇怪,因为我的服务器在一夜之间以某种方式更改了 python 版本:P

标签: python syntax async-await discord discord.py


【解决方案1】:

2021 年的更新答案(discord.py 1.x - 2.x):

discord.py 目前支持 Python 3.5 及更高版本。如果您收到SyntaxError,则表示您使用的是旧版本的 Python,并且不支持 discord.py。

首先,安装更高版本的 Python(在此消息中首选 3.8.x),并在运行机器人时运行 python3.8 bot.pypy -3.8 bot.py(适用于 Windows)。注意:安装时不要忘记选择“Add Python to PATH”。


原答案

Asynchronous requests were introduced to Python in v3.3,如果您运行的是 v3.3 之前的 Python(包括 v2.X),则必须安装更新版本的 Python。


在您运行 Python 3.3 时:asyncio 不是标准库的一部分,you'll need to install it manually from pypi

pip install asyncio

asyncawait 关键字仅对 Python 3.5 或更高版本有效。如果您使用的是 Python 3.3 或 3.4,则需要对代码进行以下更改:

  1. 使用@asyncio.coroutine 装饰器代替async 语句:
async def func():
    pass

# replace to:

@asyncio.coroutine
def func():
    pass
  1. 使用yield from 而不是await
await coroutine() 

# replace to:

yield from coroutine()

这是您的函数需要更改为的示例(如果您使用的是 3.3-3.4):

import asyncio

@asyncio.coroutine 
def background_loop():
    yield from client.wait_until_ready()
    while not client.is_closed:
        channel = client.get_channel("************")
        messages = ["Hello!", "How are you doing?", "Testing!!"]
        yield from client.send_message(channel, random.choice(messages))
        yield from asyncio.sleep(120)

较新版本的 Python 3 仍支持上述语法,但如果不需要支持 Python 3.3-3.4,建议使用 awaitasync。大家可以参考这个documentation,这里有一个简短的sn-p:

async def 类型的协程是在 Python 3.5 中添加的,并且是 如果不需要支持较旧的 Python 版本,建议使用。


旁白:

目前支持 3.4.2-3.6.6,(不支持 3.3-3.4.1,截至 2019 年 1 月为 3.7)。

对于使用 discord.py 进行开发,我建议使用 discord.py 重写分支:

支持 3.5.3-3.7。

【讨论】:

    【解决方案2】:

    从版本 3.7 asyncawait 是保留关键字

    就像下图中的错误。

    复制并打开路径(不带__init__.py)。 您将获得 .py 文件的列表

    async.py 重命名为 _async.py 或任何您想要的名称,因为 async 现在是我们从 3.7 版开始的保留关键字。

    重命名后,到处修改新名称。

    *注意 虽然不是永久的解决方案 但如果出现相同的语法错误,它对我有用 在使用 Firebase 时。 最好的解决方案是使用以前版本的 Python。即低于 3.7 的版本。

    【讨论】:

      【解决方案3】:

      我通过从 github 安装更新的 PyMC 解决了这个问题(他们纠正了 Python 3.7 中发生的错误):

      pip install git+https://github.com/pymc-devs/pymc.git

      【讨论】:

        【解决方案4】:

        如果您使用的是 Mac,请尝试使用 python3 discord_bot.py 而不是 python discord_bot.py 运行文件,因为 python 默认为版本 2.7。

        【讨论】:

          猜你喜欢
          • 2021-01-17
          • 2021-08-30
          • 1970-01-01
          • 2014-08-25
          • 2011-02-14
          • 1970-01-01
          • 2018-08-18
          • 1970-01-01
          相关资源
          最近更新 更多