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
相关产品推荐
相关产品推荐

