Python 如何导入discord bot对象以在其他模块中使用

Python 如何导入discord bot对象以在其他模块中使用,python,python-3.x,python-import,discord,discord.py,Python,Python 3.x,Python Import,Discord,Discord.py,我试图减少discord bot主文件中的行数,因此我创建了一个模块来处理某些命令,问题是我必须将bot对象传递给模块中主文件之外的每个函数,这增加了传递给每个函数的变量的数量,它变得非常混乱 在下面的示例中,KsBot.py是我的主bot文件,BasicCommand.py是我编写简单命令并将其导入KsBot.py以使用的地方,KsBot是bot对象 在KsBot.py中: if message.content.startswith("//ping"): await BasicComm

我试图减少discord bot主文件中的行数,因此我创建了一个模块来处理某些命令,问题是我必须将bot对象传递给模块中主文件之外的每个函数,这增加了传递给每个函数的变量的数量,它变得非常混乱

在下面的示例中,KsBot.py是我的主bot文件,BasicCommand.py是我编写简单命令并将其导入KsBot.py以使用的地方,KsBot是bot对象

在KsBot.py中:

if message.content.startswith("//ping"):
    await BasicCommand.ping(KsBot,message.channel)
在BasicCommand.py中:

async def ping(bot,channel):
    KsBot = bot
    await KsBot.send_message(channel,"pong")
我想在BasicCommand.py中添加一个变量来表示KsBot,这样我就不必在每个函数中都传入bot对象,我已经尝试将bot对象本身导入BasicCommand.py,方法是在代码顶部添加以下内容:

from KsBot import KsBot
但它给了我一个错误,说:

ImportError:无法导入名称“KsBot”


有人能给我解释一下为什么会发生这个错误,以及是否有任何方法可以传递这个机器人对象。我不熟悉编程和discord.py,因此也非常感谢您的建议:D

一个好的discord.py bot不会手动调用消息上
的所有命令,您应该使用
@bot.command(pass\u context=True)
添加命令

去掉消息(…)上的
def:
,因为在那里你没有做任何有意义的事情

一个文件中的粗略结构(无拆分):

就这么简单


现在,将多个文件拆分为多个文件,最简单的方法是定义自己的
内置.bot
。或者,您可以使用第二个文件中的
def设置(bot):
查看
bot.load_扩展名(“文件名”)
。这两种方法都是有效的,但后者最适用于COG

以下示例适用于第一种方法:

# ksbot.py
from discord.ext import commands
import builtins

bot = commands.Bot('//')
builtins.bot = bot

import basiccommand

@bot.command(pass_context=True)
async def ping(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "pong")

bot.run("TOKEN")


# basiccommand.py

from discord.ext import commands
from builtins import bot

@bot.command(pass_context=True)
async def hello(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "hi")
现在您有两个命令,ping,它发送“pong”,hello,它发送“hi”

如果必须在消息上添加
句柄,请确保在消息上的
末尾添加
bot.process\u命令(消息)
,上述示例不要求您具有事件句柄


旁注:按照惯例,文件名应该小写。

这可能与只能导入模块和类定义而不是实际变量有关。也许您可以定义一个运行
全局KsBot的
设置(bot)
;KsBot=bot
并且在调用
KsBot.run()
之前运行一次,不确定它的工作情况如何,但可能会help@LegacyKS您能否发布KsBot.py的基本结构(即运行bot时bot+的定义)和文件结构?一般来说,discord.py可以选择“添加扩展名”到外部文件。@squaswin谢谢你的建议,它工作得很好,但是如果可能的话,我仍然希望在没有函数的情况下传递bot对象,因为我将来可能会制作更多的模块。我会在等待时使用它,看看是否有更好的选择:)@abccd嗨,谢谢你的回复,我对这个编程还是新手,不知道你在说什么,但这是我在github上的全部文件,我希望dat能帮上忙:D文件:啊,非常感谢你的所有建议、提示和建议,只要我能抽出时间,我会尽快尝试,让你知道我认为:Dfirst方法仍然会给出相同的错误,它会说importTerror:无法导入名称“KsBot”@LegacyKS你的代码是什么?如果您遵循我的代码结构,它将起作用,正如您所看到的,我没有进行循环导入。现在,dis是我所拥有的:我仍在尝试第一种方法,因此这是我仅有的两个文件。@LegacyKS第一个脚本中的
builtins.bot=bot
部分需要位于导入语句之上,才能导入到第二个文件。请参见我提供的示例。
# ksbot.py
from discord.ext import commands
import builtins

bot = commands.Bot('//')
builtins.bot = bot

import basiccommand

@bot.command(pass_context=True)
async def ping(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "pong")

bot.run("TOKEN")


# basiccommand.py

from discord.ext import commands
from builtins import bot

@bot.command(pass_context=True)
async def hello(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "hi")