F.M*_*F.M 11 python linux environment-variables dotenv
我正在尝试制作一个不和谐的机器人,当我尝试使用 load_dotenv() 加载 .env 时,它不起作用,因为它说
Traceback (most recent call last):
File "/home/fanjin/Documents/Python Projects/Discord Bot/bot.py", line 15, in <module>
client.run(TOKEN)
File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 708, in run
return future.result()
File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 687, in runner
await self.start(*args, **kwargs)
File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 650, in start
await self.login(*args, bot=bot)
File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 499, in login
await self.http.static_login(token.strip(), bot=bot)
AttributeError: 'NoneType' object has no attribute 'strip
Run Code Online (Sandbox Code Playgroud)
这是我的机器人代码:
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)
Run Code Online (Sandbox Code Playgroud)
还有 save.env 文件:(这是一个假令牌)
# .env
DISCORD_TOKEN={XXXXXXXX}
Run Code Online (Sandbox Code Playgroud)
两个文件都位于同一目录中,我什至尝试使用显式指定 .env 的路径
env_path = Path('path/to/file') / '.env'
load_dotenv(dotenv_path=env_path)
Run Code Online (Sandbox Code Playgroud)
但这也不起作用
检查 .env 文件中的语法是否正确,原始文档将是最好的来源 - Python Dotenv(示例如下)
DOMAIN=example.org
ADMIN_EMAIL=admin@${DOMAIN}
ROOT_URL=${DOMAIN}/app
Run Code Online (Sandbox Code Playgroud)
对我有用的解决方案是使用find_dotenv()而不是内部文件路径load_dotenv(),原因是load_dotenv()没有正确加载 .env 文件。find_dotenv()是一个自动查找 .env 文件(如果它与代码文件位于同一文件夹中)的函数。
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
Run Code Online (Sandbox Code Playgroud)
您可以使用将搜索限制为当前项目文件夹,sys.path[1]以确保您正在阅读所需的文件。
import sys
from dotenv import load_dotenv
load_dotenv(sys.path[1]) #try .path[0] if 1 doesn't work
Run Code Online (Sandbox Code Playgroud)
因为,我将.env文件移动到另一个子文件夹中config,所以我必须提供完整路径才能load_dotenv()使其工作。
import sys
from dotenv import load_dotenv
path = sys.path[1]+'/config/.env' #try .path[0] if 1 doesn't work
load_dotenv(path)
Run Code Online (Sandbox Code Playgroud)
[编辑]
您需要输入完整路径。
使用
任何一个os.path.expanduser('~/Documents/MY_PROJECT/.env')
或者:load_dotenv('/home/MY_USER/Documents/MY_PROJECT/.env')
它会起作用的。
或者您在代码编辑器中将当前工作目录更改为“.env”文件所在的位置(应该是项目文件夹)。
或者您在代码编辑器的菜单中打开项目文件夹,这应该使项目文件夹成为当前工作目录。
在 Linux 上,您还可以转到终端中的项目文件夹,然后从那里启动代码编辑器,例如键入codium或在命令提示符中使用的任何内容。
因为,我将 .env 文件移到了另一个子文件夹配置中,所以我必须提供 load_dotenv() 的完整路径才能使其工作。
这给了我检查工作目录的想法。
os.getcwd()给了我一个位于树上的文件夹。然后我将“.env”文件复制到该工作目录中并且它起作用了。
更改工作目录取决于您的代码编辑器。我使用的是codium,它是vscode的开源版本,那么你可以按照例如VSCode中的Python:每次将工作目录设置为python文件的路径
您也可以输入完整路径。
有趣的是,我在来这里之前检查过这一点,但我复制了从终端获得的路径,以 开头'~/Documents/MY_PROJECT,它找不到该文件,但也没有发出警报,任何尝试过的环境变量都是空的 - 只是因为“ .env”文件本身从未被读取。
我遇到了类似的问题,就我而言,这解决了它:
load_dotenv()我需要做的不是做 load_dotenv(override=True)。这是因为我手动设置了文件中的变量之一.env,因此它没有使用.env文件中设置的值进行更新。
该参数override默认为 False。以下是来自 dotenv github 的定义:
override: Whether to override the system environment variables with the variables
from the `.env` file.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44104 次 |
| 最近记录: |