Discord Bot-“属性错误:'NoneType'对象没有属性'strip'。

时间:2020-07-01 18:00:11

标签: python discord discord.py

我是一名新编码员,我一直在遵循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' 

5 个答案:

答案 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”,而没有“ {}”