我是一名新编码员,我一直在遵循tutorial如何使用下面的代码创建了一个不和谐的机器人,该代码已被虚拟地复制了本教程中的代码,并且我已经创建了.env文件来存储我的AuthToken。每次我运行代码,都会在上述代码下面出现错误。有小费吗?预先感谢!
代码:
import os
import discord
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
client = discord.Client()
@client.event
async def on_ready():
print(f'{client.user} has connected to Discord!')
client.run(TOKEN)
错误:
Traceback (most recent call last): File "/Users/XXXXXXXXXXXX/scratch/discordbot/app.py", line 16, in <module>
client.run(TOKEN) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 640, in run
return future.result() File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 621, in runner
await self.start(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 584, in start
await self.login(*args, bot=bot) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 442, in login
await self.http.static_login(token.strip(), bot=bot) AttributeError: 'NoneType' object has no attribute 'strip'
答案 0 :(得分:4)
我正在学习相同的教程并遇到相同的错误。我的问题是我错误地创建了“.env”文件。在教程中它说“在与 bot.py 相同的目录中创建一个名为 .env 的文件:” - 这是我的问题。如果您创建一个新的文本文档,粘贴代码,然后将其保存为名称“.env”,您将实际创建的是一个名为“.env.txt”的文本文件。
要解决此问题,请转到保存 python 脚本的目录(对我而言,这是 C:\Thonny\DiscordBots),然后右键单击该文件夹并选择“新建 > 文本文档”。不要更改文件名,只需将其保留为“新文本文档”。打开此文件(应在记事本中打开),然后粘贴教程中的代码(另外,请记住将您的机器人的实际令牌替换为名为 {your-bot-token} 的占位符变量)。现在,转到“文件 > 另存为”,然后在 文件名 字段中输入“.env”,就像教程所说的那样; 在点击保存之前,还要点击保存类型下拉(应该在文件名正下方),而不是将其保留为默认类型(*.txt),将其更改为“所有文件”。
如果您已正确完成此操作,您应该会在文件资源管理器中看到您的“.env”文件,并且“类型”列现在将显示“ENV 文件”而不是“文本文档”。尝试再次运行代码。
这对我有帮助。我的理解是“load_dotenv()”正在寻找一个 ENV type 文件,而不仅仅是 any 名为“.env”(任何类型)的文档。只要此文件与您正在运行的脚本位于同一目录中,它就应该可以工作。
答案 1 :(得分:2)
这个错误是由于在.env文件中获取TOKEN值失败引起的,可以通过-
from dotenv import load_dotenv
load_dotenv('---.env')
它对我有用!!!
答案 2 :(得分:1)
错误是由于TOKEN
设置为None
,如果变量不存在或存在且设置为os.getenv('DISCORD_TOKEN')
,则None
返回
确保您的.env文件位于同一目录中,例如:
.
├── .env
└── bot.py
令牌是环境变量,而不是python变量。环境变量的分配遵循您所使用的Shell的语法。这意味着=
符号周围没有空格。
请注意使用dotenv
将变量导出到shell时的操作顺序(请参阅自述文件here):
Python-dotenv可以使用POSIX变量对变量进行插值 扩展。
变量的值是在 以下列表:
- 该变量在环境中的值。
- .env文件中该变量的值。
- 默认值(如果提供)。
- 空字符串。
确保 变量像$ {HOME}一样用{}括起来,例如裸变量 因为$ HOME不会展开。
给出的示例是:
CONFIG_PATH=${HOME}/.config/foo
DOMAIN=example.org
EMAIL=admin@${DOMAIN}
DEBUG=${DEBUG:-false
由于这个原因,您可能需要在继续操作之前清除相关的shell变量,因为dotenv
要做的第一件事是使用已经定义的变量,该变量可能在初始设置中设置为空字符串(例如unset DISCORD_TOKEN
,或使用source ~/.bashrc
之类的东西重新启动Shell。)
出于调试目的,我建议使用print(os.getenv('DISCORD_TOKEN'))
来确切了解此变量的设置。您还可以尝试在环境设置过程中查看load_dotenv(verbose=True)
的输出。
答案 3 :(得分:1)
环顾了几个论坛然后发现了这个 - 救命稻草,谢谢!
现在排序;
load_dotenv('Token.env')
TOKEN = os.getenv('DISCORD_TOKEN')
Token.env;
DISCORD_TOKEN=这里的令牌
答案 4 :(得分:0)
在您的.env文件中,它是类似于“ BOT_TOKEN = {WHAT_EVER_TOKEN}”还是其他名称? 如果那是那样,那将是错误的 正确的方法是“ BOT_TOKEN = WHAT_EVER_TOKEN”,而没有“ {}”