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

WSL环境下含特殊字符的.env文件环境变量解析问题

WSL环境下.env文件带等号变量的解析问题

在Windows Subsystem for Linux(WSL)环境中,运行Python代码时遇到.env文件环境变量解析异常:非调试模式下,带引号且包含=的变量值会被=截断,仅保留前半部分;但调试模式下可正确解析完整值。

环境与代码说明

.env文件内容

TOKEN="abc=def"

尝试的python-dotenv实现

from dotenv import load_dotenv
import os

load_dotenv(dotenv_path='test.env')

token = os.getenv('TOKEN')
print(token)

尝试的pydantic-settings实现

main.py:

from env import EnvVarsConfig

settings = EnvVarsConfig()
token = settings.TOKEN
print(token)

env.py:

from pydantic_settings import BaseSettings

class EnvVarsConfig(BaseSettings):
    TOKEN: str

    class config:
        env_file = '.env'
        case_sensitive = True

问题现象

  • 非调试模式运行:输出abc(=被当作分隔符,值被截断)
  • 调试模式运行:输出正确的abc=def
  • 已尝试的无效方法:去掉引号、转义=、手动加载.env文件
  • 使用poetry管理环境,通过poetry shell作为解释器

解决方案

1. 修复pydantic-settings配置类命名

pydantic-settings要求配置类必须为大写Config,否则配置不生效(无法加载.env文件,直接读取shell环境变量)。修改env.py:

from pydantic_settings import BaseSettings

class EnvVarsConfig(BaseSettings):
    TOKEN: str

    class Config:  # 改为大写Config
        env_file = '.env'
        case_sensitive = True

2. 强制python-dotenv覆盖环境变量

python-dotenv默认不会覆盖已存在的shell环境变量,若poetry shell中已设置同名变量,会优先使用该值。添加override=True参数强制覆盖:

from dotenv import load_dotenv
import os

load_dotenv(dotenv_path='test.env', override=True)

token = os.getenv('TOKEN')
print(token)

3. 清除shell中的冲突环境变量

在poetry shell中执行命令,清除已存在的TOKEN变量:

unset TOKEN

之后再运行代码,即可正确读取.env文件中的完整值。

4. 手动解析.env文件(备选方案)

若第三方库解析规则不符合需求,可手动读取并解析,确保只分割第一个=:

def load_env_file(file_path):
    env_vars = {}
    with open(file_path, 'r') as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith('#'):
                continue
            # 仅分割第一个=,避免截断值中的=
            key, value = line.split('=', 1)
            # 去除值两端的引号(如果存在)
            if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")):
                value = value[1:-1]
            env_vars[key] = value
    return env_vars

config = load_env_file('test.env')
print(config['TOKEN'])  # 输出abc=def

内容的提问来源于stack exchange,提问作者Davi Bogo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:53:17