如何在Python中获取.env文件更新后的Token值?
问题:更新.env中的Token后无法在main.py获取最新值
文件结构
|_ login.py |_ main.py |_ .env
login.py中包含login()函数,用于用户登录并在.env文件中设置Token。.env文件已被成功更新,但在main.py中尝试获取更新后的Token时,得到的仍是旧值。
login.py 代码
import os from dotenv import load_dotenv, set_key dotenv_path = os.path.join(os.path.dirname(__file__), '.env') load_dotenv(dotenv_path) creds = { 'token': os.environ.get('TOKEN', ''), 'username': os.environ.get('USERNAME', ''), 'password': os.environ.get('PASSWORD', ''), 'base_url': os.environ.get('BASE_URL', '') } def api_login(): req = requests.post(creds).json() set_key(dotenv_path, 'token', req.get('token'))
main.py 代码
import os import requests from dotenv import load_dotenv from login import login dotenv_path = os.path.join(os.path.dirname(__file__), '.env') load_dotenv(dotenv_path) creds = { 'token': os.environ.get('TOKEN', ''), 'username': os.environ.get('USERNAME', ''), 'password': os.environ.get('PASSWORD', ''), 'base_url': os.environ.get('BASE_URL', '') } def make_request(): if creds['token'] == '': login() print(os.environ.get('TOKEN', ''))
目前我能获取新Token的方式只有两种:
- 在
login()中将值存入os.environ['temp_token'] = req.get('token'),再在main.py中通过os.environ['temp_token']获取; - 让
login()返回新Token。
有没有办法直接从.env文件中获取更新后的值?
解决方案
核心原因
load_dotenv()默认只会把.env文件的内容加载到os.environ一次,之后即使.env文件内容更新,os.environ里的旧值也不会自动刷新。同时main.py中初始化的creds字典是程序启动时读取的旧Token值,后续不会自动同步文件更新。
直接从.env获取新值的方法
- 重新加载.env并覆盖环境变量
在调用login()后,重新调用load_dotenv()并设置override=True,强制用.env的新值覆盖os.environ中的旧值,同时刷新本地字典:
def make_request(): if creds['token'] == '': login() # 重新加载.env,强制覆盖现有环境变量 load_dotenv(dotenv_path, override=True) # 刷新creds字典的token值 creds['token'] = os.environ.get('TOKEN', '') print(os.environ.get('TOKEN', ''))
- 手动读取并解析.env文件
跳过环境变量机制,直接读取.env文件提取最新Token:
def get_latest_token(): with open(dotenv_path, 'r') as f: for line in f: line = line.strip() if not line or line.startswith('#'): continue key, value = line.split('=', 1) if key == 'TOKEN': return value.strip('"').strip("'") return '' # 在main.py中使用 def make_request(): if creds['token'] == '': login() # 直接读取最新token latest_token = get_latest_token() creds['token'] = latest_token os.environ['TOKEN'] = latest_token print(creds['token'])
更简洁的方案推荐
让login()返回新Token是逻辑最清晰的写法,既更新了.env文件,又能直接拿到最新值,避免额外的文件读取操作:
# 修改login.py的api_login函数 def api_login(): req = requests.post(creds).json() new_token = req.get('token') set_key(dotenv_path, 'token', new_token) return new_token # 在main.py中调用 def make_request(): if creds['token'] == '': new_token = login() creds['token'] = new_token os.environ['TOKEN'] = new_token print(os.environ.get('TOKEN', ''))
内容的提问来源于stack exchange,提问作者soul
相关产品推荐
相关产品推荐

