You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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获取新值的方法

  1. 重新加载.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', ''))
  1. 手动读取并解析.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:24:22