我试图让 Discord 机器人使用
@event.command
装饰器从 .log 文件打印出某些文本,但它显示错误。仅当一行文本包含 IMPORTANT:
时,Discord 机器人才会打印出文本
此外,这种情况下的日志文件会不断更新和添加文本。我使用的是 Windows 10,使用 Python 3.10.11。
我见过有关机器人读取某些文本,然后将其记录到 txt 文件的文档,但没有显示如何直接从 .log 文件复制。然后将其打印到 Discord。 我预计会看到机器人吐出日志文件行中包含
IMPORTANT:
的文本。但一旦我输入 ?run
我只会收到错误,我对 python 还很陌生,所以我很想看到语法的基本更正,以及代码结构的错误,
这是我收到的错误。
回溯(最近一次调用最后一次):文件“C:\Users\\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py”,第 235 行,在包装的 ret 中=等待coro(\ * args,\ * \ * kwargs)文件“C:\ Users \ * USER \ OneDrive \ Desktop \ DiscordBot \ main.py”,行18、在日志行中的以下行中:TypeError:“coroutine”对象不可迭代
上述例外是
导致以下异常的直接原因:
回溯(最近一次调用最后一次):文件“C:\Users\*\*USER\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py”,第 1366 行,在调用await ctx.command.invoke(ctx)文件“C:\Users|\\*USER\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py”,第 1029 行,在调用等待注入(\*ctx. args, \*\*ctx.kwargs) # 类型:忽略文件“C:\Users\\*USER\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py”,第 244 行,在来自 exc 不和谐的包装中引发 CommandInvokeError(exc) .ext.commands.errors.CommandInvokeError:命令引发异常:TypeError:“协程”对象不可迭代C:\Users\\*USER\AppData\Local\Programs\Python\Python310\lib\asyncio\events.py:80: RuntimeWarning: 协程 'Command.\__call__\_' 从未等待 self.\_context.run( self.\_callback, \*self.\_args) RuntimeWarning: 启用tracemalloc 来获取对象分配回溯
这是我的代码:
import discord
import time, os
from discord.ext import commands
@client.event
async def coroutine(ctx, *args):
print("Bot Is Ready")
@client.command()
async def run(thefile):
if __name__ == "__main__":
logfile = open(os.getenv("APPDATA")+"/.directory/logs/announcement.log", "r")
loglines = follow(logfile)
for line in loglines:
if "IMPORTANT:" in line:
await print (line)
client.run("token is here")
您的代码中有多个错误,我将在下面解决。但是,我们不知道
follow
方法是做什么的,因为它不是内置方法,并且您没有提供它的代码。
您的主要问题是
follow
是一个协程,但您没有 await
它。协程是异步方法,例如 discord.py 中的 ctx.send
和 guild.edit
- 您必须在调用该方法之前放置 await
。
loglines = await follow(logfile)
现在,关于其他问题:
on_ready
函数才能让库识别它,您调用了它 on_ready
coroutine
Bot.command
(我们不知道 async def run(ctx: commands.Context):
的用途,如果它被使用的话)thefile
if __name__ == "__main__":
您没有关闭client.run()
logfile
同样,我们不知道 logfile.close()
follow()
,因为这已经返回 logfile.readlines()
(包含字符串的列表),其中每个列表项都是文件中的一行List[str]
确实可以工作,即使你
print()
它,这很奇怪,你会得到一个错误缩进不一致,这意味着在某些行上,您使用了 3 个空格,而在另一行上,您使用了 1 个,然后是 2 个,然后是 4 个,等等 - 缩进必须始终使用相同数量的空格,以便它们能够被正确识别Python解释器。在任何文本编辑软件中使用 await
+
相比,
print ("Hello World")
看起来很奇怪
基本上是“Python 不成文的规则”,而 PEP 8 是描述应如何格式化代码的标准。您不需要以这种确切的方式格式化您的代码 - 您完全可以自由地在方法名称后面放置任意数量的空格 - 但以这种方式格式化您的代码通常更具可读性和更漂亮。