Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。'
Posted
技术标签:
【中文标题】Discord Bot - “属性错误:\'NoneType\' 对象没有属性\'strip。\'【英文标题】:Discord Bot - "Attribute Error: 'NoneType' object has no attribute 'strip.'Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。' 【发布时间】:2020-10-22 06:02:10 【问题描述】:我是一名新的编码员,我一直在关注 atutorial 如何创建一个不和谐的机器人,下面的代码实际上是直接从教程中复制的代码,我已经创建了一个 . 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'
【问题讨论】:
我知道您无法共享令牌,但您确定您在.env
文件中正确定义了令牌吗?
我很确定我做到了。基本上看起来像 DISCORD_TOKEN = XXXXXXXXXXX... 让您了解我做了什么。我只是感到困惑,因为即使我已经安装了所有更新的模块,访问.env
文件似乎也可能存在问题。我知道的不多,但我想不出还有什么可能出错的地方。
试试不带空格的。在本教程中,DISCORD_TOKEN
与其值之间没有空格。
【参考方案1】:
我遵循相同的教程并遇到了相同的错误。对我来说,问题是我错误地创建了“.env”文件。在教程中它说“在与 bot.py 相同的目录中创建一个名为 .env 的文件:” - 这是我的问题。如果您创建一个新的文本文档,粘贴代码,然后将其保存为名称“.env”,您将实际创建一个名为“.env.txt”的文本文件。
要解决这个问题,请转到保存 python 脚本的目录(对我来说,这是 C:\Thonny\DiscordBots),然后右键单击该文件夹并选择“新建 > 文本文档”。不要更改文件名,只需将其保留为“新建文本文档”即可。打开这个文件(应该在记事本中打开),然后粘贴教程中的代码(另外,记住用你的机器人的实际令牌替换名为 your-bot-token 的占位符变量)。现在,转到“文件>另存为”并在文件名字段中,输入“.env”,就像教程所说的那样; 在您点击保存之前,还请单击 另存为类型 下拉菜单(应该在 文件名 的正下方),而不是将其保留为默认类型(*.txt),将其更改为“所有文件”。
如果您已正确执行此操作,您应该会在文件资源管理器中看到您的“.env”文件,并且“类型”列现在将显示“ENV 文件”而不是“文本文档”。尝试再次运行代码。
这对我有帮助。我的理解是“load_dotenv()”正在寻找 ENV type 的文件,而不仅仅是名为“.env”(任何类型)的 any 文档。只要将此文件与您正在运行的脚本放在同一目录中,它就应该可以工作。
【讨论】:
谢谢。我正在遵循相同的教程,这解决了错误。 10/10【参考方案2】:这个错误是由于在.env文件中获取TOKEN值失败引起的,可以通过-
from dotenv import load_dotenv
load_dotenv('---.env')
对我有用!!!
【讨论】:
谢谢 :) 虽然原版已经有这两行,但我没有,这有帮助!【参考方案3】:错误是由于TOKEN
被设置为None
,这是os.getenv('DISCORD_TOKEN')
在变量不存在或存在并设置为None
时返回的内容。
确保您的 .env 文件位于同一目录中,例如:
.
├── .env
└── bot.py
token 是环境变量,不是 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)
的输出。
【讨论】:
你对这个名字完全正确 - 修正了这个问题。我确实对.env
文件进行了调整,使其没有空格,但它仍然出现了同样的错误。我尝试了几种不同的写法,都没有成功
把它变成一个字符串怎么样? (即DISCORD_TOKEN="my-token-here"
)
刚才试过了,不幸的是同样的结果(谢谢你的建议顺便说一句,我真的很感谢你的帮助!)
你能看到load_dotenv(verbose=True)
的输出是什么吗?
刚刚试了一下,结果一样——并没有改变错误类型的输出【参考方案4】:
在您的 .env 文件中,它是像“BOT_TOKEN=WHAT_EVER_TOKEN”还是其他什么? 如果是这样,那就错了 正确的方式是“BOT_TOKEN=WHAT_EVER_TOKEN”,只是没有“”
【讨论】:
我知道这个问题,因为我以前遇到过这个问题,而且完全一样......如果这不起作用,那么它可能与IDE或其他东西有关。 不应该有任何东西,只有令牌本身和“变量”。【参考方案5】:浏览了几个论坛,然后发现了这个 - 救命稻草,谢谢!
现在排序为;
load_dotenv('Token.env')
TOKEN = os.getenv('DISCORD_TOKEN')
Token.env;
DISCORD_TOKEN=这里是令牌
【讨论】:
【参考方案6】:我遇到了同样的问题,load_dotenv()
找不到与我的 .py 文件位于同一文件夹中的 .env 文件,这导致了错误 Attribute Error:'NoneType' object has no attribute '剥离'。
我尝试了一系列不同的修复,从 load_dotenv(find_dotenv())
到 os.envrion['TOKEN']
而不是 os.getenv("TOKEN")
以及其他人在这个堆栈溢出线程中给我们的所有其他修复。您可能已经尝试过那些没有像我一样运气的方法。
为了解决这个问题,我使用了:
load_dotenv(dotenv_path = os.path.abspath(os.getcwd()) + "\DiscordBot\discordbot.env")
这指定了 load_dotenv() 将加载的确切文件(我认为)。记下os.path.abspath(os.getcwd())
。这将返回您的项目文件所在的当前工作目录 (getcwd())。在我的例子中,它会返回这个字符串:F:\dev\Python\YaykobDiscordBot
.
我的实际 .py 文件位于更深的另一个文件夹中:"F:\dev\Python\YaykobDiscordBot\DiscordBot\YaykobBot.py"
,并且在它旁边的同一个文件中是
"F:\dev\Python\YaykobDiscordBot\DiscordBot\discordbot.env"
这是我存储令牌的地方。
你可能注意到了,你只需要给load_dotenv()
.env 文件所在位置的文件路径。就我而言,我可以写:
load_dotenv(dotenv_path = "F:\dev\Python\YaykobDiscordBot\DiscordBot\discordbot.env")
它会完美运行。我使用os.path.abspath
,因为只要我想从 Github 克隆我的存储库,它就可以工作。
【讨论】:
【参考方案7】:您必须从 .env 文件中删除空格。所以如果你的文件看起来像这样
DISCORD_TOKEN = 1234ABC
它不会接受它。它需要看起来像这样
DISCORD_TOKEN=1234ABC
【讨论】:
【参考方案8】:我遇到了同样的问题,我知道如何解决它。所以基本上出于某种原因 vscode 不会接受 os.getenv(TOKEN)。所以我所做的就是将令牌直接放入 client.run("Your TOKEN here") 函数中。
【讨论】:
虽然这是一种解决方案,但强烈建议避免在生产代码中直接使用令牌、密码或其他敏感数据。【参考方案9】:看来读取的令牌是'NoneType' object。
因此,如果您使用client.run(str(TOKEN))
而不是client.run(TOKEN)
,该方法应该能够正确处理令牌并且您的机器人应该可以工作。
【讨论】:
以上是关于Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。'的主要内容,如果未能解决你的问题,请参考以下文章
Discord Bot 回复自己,无法识别 message.author.bot