Python [语法无效] 带有异步定义
Python [Invalid syntax] with async def
我正在尝试使用 Python 编写 discord 机器人,我遇到过并把这个机器人放在一起。
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
这是为什么?我之前测试的时候从来没有收到过。
2021 年的更新答案(discord.py 1.x - 2.x):
discord.py 目前支持 Python 3.5 及更高版本。如果您收到 SyntaxError
,则表示您使用的是 Python 的旧版本并且不受 discord.py 支持。
首先,安装更高版本的 Python(从本消息开始,首选 3.8.x),然后 运行 python3.8 bot.py
或 py -3.8 bot.py
(对于 Windows)当 运行 连接你的机器人时。注意:安装时不要忘记选择“Add Python to PATH”。
原答案
Asynchronous requests were introduced to Python in v3.3,如果您 运行ning Python 早于 v3.3(包括 v2.X),则必须安装更新版本的Python.
只有如果你是运行宁Python 3.3:asyncio
不是stdlib的一部分,you'll need to install it manually from pypi:
pip install asyncio
async
和 await
关键字仅 对 Python 3.5 或更新的 有效。如果您使用的是 Python 3.3 或 3.4,则需要对代码进行以下更改:
- 使用
@asyncio.coroutine
装饰器代替 async
语句:
async def func():
pass
# replace to:
@asyncio.coroutine
def func():
pass
- 使用
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)
上述语法在Python3的较新版本中仍然支持,但如果不需要支持[=85=,建议使用await
和async
] 3.3-3.4。您可以参考此 documentation,这里有一个简短的片段:
The async def
type of coroutine was added in Python 3.5, and is
recommended if there is no need to support older Python versions.
旁白:
discord.py目前支持3.4.2-3.6.6,(不支持3.3-3.4.1,2019年1月3.7)。
为了使用 discord.py 进行开发,我建议使用 discord.py 重写分支:
discord.py-rewrite支持3.5.3-3.7.
从 3.7 版开始
async
和 await
是保留关键字
喜欢下图中的错误。
复制并打开路径(不带__init__.py
)。
您将获得 .py 文件列表
将 async.py
重命名为 _async.py
或任何您想要的名称,因为从 3.7 版开始,async 现在是我们的保留关键字。
改名后,处处修改新名称
*注意
虽然不是长久之计
但如果出现相同的语法错误,它对我有用
在使用 firebase 时。
最好的解决方案是使用以前版本的 Python。即低于 3.7 的版本。
我通过从 github 安装更新的 PyMC 解决了这个问题(他们纠正了 Python 3.7 中发生的错误):
pip install git+https://github.com/pymc-devs/pymc.git
如果您使用 Mac,请尝试 运行 使用 python3 discord_bot.py
而不是 python discord_bot.py
的文件,因为 python
默认为版本 2.7。
我正在尝试使用 Python 编写 discord 机器人,我遇到过并把这个机器人放在一起。
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
这是为什么?我之前测试的时候从来没有收到过。
2021 年的更新答案(discord.py 1.x - 2.x):
discord.py 目前支持 Python 3.5 及更高版本。如果您收到 SyntaxError
,则表示您使用的是 Python 的旧版本并且不受 discord.py 支持。
首先,安装更高版本的 Python(从本消息开始,首选 3.8.x),然后 运行 python3.8 bot.py
或 py -3.8 bot.py
(对于 Windows)当 运行 连接你的机器人时。注意:安装时不要忘记选择“Add Python to PATH”。
原答案
Asynchronous requests were introduced to Python in v3.3,如果您 运行ning Python 早于 v3.3(包括 v2.X),则必须安装更新版本的Python.
只有如果你是运行宁Python 3.3:asyncio
不是stdlib的一部分,you'll need to install it manually from pypi:
pip install asyncio
async
和 await
关键字仅 对 Python 3.5 或更新的 有效。如果您使用的是 Python 3.3 或 3.4,则需要对代码进行以下更改:
- 使用
@asyncio.coroutine
装饰器代替async
语句:
async def func():
pass
# replace to:
@asyncio.coroutine
def func():
pass
- 使用
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)
上述语法在Python3的较新版本中仍然支持,但如果不需要支持[=85=,建议使用await
和async
] 3.3-3.4。您可以参考此 documentation,这里有一个简短的片段:
The
async def
type of coroutine was added in Python 3.5, and is recommended if there is no need to support older Python versions.
旁白:
discord.py目前支持3.4.2-3.6.6,(不支持3.3-3.4.1,2019年1月3.7)。
为了使用 discord.py 进行开发,我建议使用 discord.py 重写分支:
discord.py-rewrite支持3.5.3-3.7.
从 3.7 版开始
async
和 await
是保留关键字
喜欢下图中的错误。
复制并打开路径(不带__init__.py
)。
您将获得 .py 文件列表
将 async.py
重命名为 _async.py
或任何您想要的名称,因为从 3.7 版开始,async 现在是我们的保留关键字。
改名后,处处修改新名称
*注意 虽然不是长久之计 但如果出现相同的语法错误,它对我有用 在使用 firebase 时。 最好的解决方案是使用以前版本的 Python。即低于 3.7 的版本。
我通过从 github 安装更新的 PyMC 解决了这个问题(他们纠正了 Python 3.7 中发生的错误):
pip install git+https://github.com/pymc-devs/pymc.git
如果您使用 Mac,请尝试 运行 使用 python3 discord_bot.py
而不是 python discord_bot.py
的文件,因为 python
默认为版本 2.7。