是否可以让 Discord 机器人打印 .log 文件中的文本? (收到一些错误)

问题描述 投票:0回答:1

我试图让 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")
python discord discord.py logfile
1个回答
0
投票

您的代码中有多个错误,我将在下面解决。但是,我们不知道

follow
方法是做什么的,因为它不是内置方法,并且您没有提供它的代码。

您的主要问题是

follow
是一个协程,但您没有
await
它。协程是异步方法,例如 discord.py 中的
ctx.send
guild.edit
- 您必须在调用该方法之前放置
await

loglines = await follow(logfile)

现在,关于其他问题:

  • 必须调用
    on_ready
    函数才能让库识别它,您调用了它
    on_ready
  • coroutine
  • s'的第一个参数将始终是'commands.Context',通常命名为“ctx”。您应该更新方法声明:
    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解释器。在任何文本编辑软件中使用 
  • Tab
  • PEP 标准规定,在使用
  • await
  • 等数学运算符时,应在它们周围放置空格,以使代码易于阅读
    PEP 标准还规定您不应在调用方法后添加空格:与 
  • +
  •  相比,
    print ("Hello World")
     看起来很奇怪
    
PEP 标准

基本上是“Python 不成文的规则”,而 PEP 8 是描述应如何格式化代码的标准。您不需要以这种确切的方式格式化您的代码 - 您完全可以自由地在方法名称后面放置任意数量的空格 - 但以这种方式格式化您的代码通常更具可读性和更漂亮。

© www.soinside.com 2019 - 2024. All rights reserved.