Discord.py 如何 运行 来自另一个文件的代码?
Discord.py how do I run code from another file?
我想稍微清理一下我的 Discord 机器人的代码,将命令拆分成不同的文件,而不是只有一个巨大的主文件。我知道我可以直接使用 import [file]
从其他文件“导入”代码,但我无法使其与 Discord 代码一起使用。
如果我尝试这样的事情:
test1.py
await ctx.send("successful")
main.py
@client.command()
asnyc def test(ctx):
import test1
我总是收到错误 SyntaxError: 'await' outside function
。我知道这是因为 await
在任何异步函数之外,但我不知道如何修复它。如果我将 test1.py
替换为 print("successful")
之类的内容,它会向控制台打印正确的响应。我已经尝试查找解决方案,但越来越困惑。
您应该导入函数并调用它们:
test1.py
async def run(ctx):
await ctx.send("successful")
main.py
import test1
@client.command()
async def test(ctx):
await test1.run(ctx)
(我想我 await
和 async
是正确的。)
import
语句的功能不同于 C++ 或 PHP 的 include
,后者有效地就地复制和粘贴包含的代码。 Python 的 import
有效地运行您正在导入的文件,并且(以最简单的形式)将创建的任何项目添加到您当前的范围。
Discord 有一个称为“扩展”的系统,专门设计用于将命令拆分到不同的文件中。确保将整个函数放在文件中,而不仅仅是函数的一部分,否则 Python 会出错。这是直接取自文档的示例:
主文件:
...create bot etc...
bot.load_extension("test") # use name of python file here
...run bot etc...
其他文件(在本例中称为 test.py):
from discord.ext import commands
@commands.command()
async def hello(ctx):
await ctx.send('Hello {0.display_name}.'.format(ctx.author))
def setup(bot):
bot.add_command(hello)
关键点是:(1) 使用 setup
函数创建 python 文件 (2) 加载扩展。
有关详细信息,请参阅:
https://discordpy.readthedocs.io/en/stable/ext/commands/extensions.html
https://discordpy.readthedocs.io/en/stable/ext/commands/cogs.html
你清理你的代码做得很好 :) 时不时地你必须这样做。要解决你的SyntaxError problem: 'await' outside function
,因为你自己说你必须使用“import”语句,然后你必须将完整的函数放在文件中,而不是函数的片段。
在test1.py
中,你需要把你的await ctx.send ("successful")
写在一个函数里面,然后你需要写async def example (ctx):
然后下面输入async def example (ctx):
#test1.py
async def example(ctx):
await ctx.send("successful")
在 main.py 中,您必须更改一些内容。您在函数内部导入了 test1,而必须在函数外部导入它。然后在 async function def test (ctx):
中,您必须编写 await test1.example (ctx)
,其中 test1
是文件,example
是 test1 函数的名称。
#main.py
#import your file here, and not inside the function
import test1
@client.command()
async def test(ctx):
await test1.example(ctx)
我想稍微清理一下我的 Discord 机器人的代码,将命令拆分成不同的文件,而不是只有一个巨大的主文件。我知道我可以直接使用 import [file]
从其他文件“导入”代码,但我无法使其与 Discord 代码一起使用。
如果我尝试这样的事情:
test1.py
await ctx.send("successful")
main.py
@client.command()
asnyc def test(ctx):
import test1
我总是收到错误 SyntaxError: 'await' outside function
。我知道这是因为 await
在任何异步函数之外,但我不知道如何修复它。如果我将 test1.py
替换为 print("successful")
之类的内容,它会向控制台打印正确的响应。我已经尝试查找解决方案,但越来越困惑。
您应该导入函数并调用它们:
test1.py
async def run(ctx):
await ctx.send("successful")
main.py
import test1
@client.command()
async def test(ctx):
await test1.run(ctx)
(我想我 await
和 async
是正确的。)
import
语句的功能不同于 C++ 或 PHP 的 include
,后者有效地就地复制和粘贴包含的代码。 Python 的 import
有效地运行您正在导入的文件,并且(以最简单的形式)将创建的任何项目添加到您当前的范围。
Discord 有一个称为“扩展”的系统,专门设计用于将命令拆分到不同的文件中。确保将整个函数放在文件中,而不仅仅是函数的一部分,否则 Python 会出错。这是直接取自文档的示例:
主文件:
...create bot etc...
bot.load_extension("test") # use name of python file here
...run bot etc...
其他文件(在本例中称为 test.py):
from discord.ext import commands
@commands.command()
async def hello(ctx):
await ctx.send('Hello {0.display_name}.'.format(ctx.author))
def setup(bot):
bot.add_command(hello)
关键点是:(1) 使用 setup
函数创建 python 文件 (2) 加载扩展。
有关详细信息,请参阅: https://discordpy.readthedocs.io/en/stable/ext/commands/extensions.html https://discordpy.readthedocs.io/en/stable/ext/commands/cogs.html
你清理你的代码做得很好 :) 时不时地你必须这样做。要解决你的SyntaxError problem: 'await' outside function
,因为你自己说你必须使用“import”语句,然后你必须将完整的函数放在文件中,而不是函数的片段。
在test1.py
中,你需要把你的await ctx.send ("successful")
写在一个函数里面,然后你需要写async def example (ctx):
然后下面输入async def example (ctx):
#test1.py
async def example(ctx):
await ctx.send("successful")
在 main.py 中,您必须更改一些内容。您在函数内部导入了 test1,而必须在函数外部导入它。然后在 async function def test (ctx):
中,您必须编写 await test1.example (ctx)
,其中 test1
是文件,example
是 test1 函数的名称。
#main.py
#import your file here, and not inside the function
import test1
@client.command()
async def test(ctx):
await test1.example(ctx)