环境变量跨上下文引用语法不同:Shell用$VAR或${VAR}(双引号内展开,需先定义并export);.env文件需python-dotenv v0.21.0+,支持${VAR}展开;PyCharm环境变量框不解析引用,须用EnvFile插件加载;Python中可手动拼接确保可控。

环境变量中引用其他变量,语法取决于你使用的上下文:是 Shell 脚本、.env 文件,还是 Python 代码中通过 python-dotenv 加载。它们的写法和行为不同,不能混用。
Shell 中引用环境变量
在 Bash/Zsh 等 shell 中,直接用 $VAR 或 ${VAR} 引用已定义的变量;若要赋值时复用,需确保被引用变量已存在且已导出(对子进程生效):
DB_HOST=127.0.0.1DB_PORT=5432-
DATABASE_URL="postgresql://user@${DB_HOST}:${DB_PORT}/mydb"(双引号内支持展开) -
export DATABASE_URL(导出为环境变量)
⚠️ 注意:export DB_URL=$DB_HOST:$DB_PORT 必须在 DB_HOST 和 DB_PORT 已定义之后执行;单引号内 '$DB_HOST' 不会展开。
.env 文件中引用变量(需 python-dotenv v0.21.0+)
.env 文件本身不是 shell,但 python-dotenv 库支持变量展开,语法与 shell 类似,推荐使用 ${VAR} 形式:
DOMAIN=example.comAPI_URL=https://${DOMAIN}/v1ADMIN_EMAIL=admin@${DOMAIN}
✅ 加载时需启用展开(默认开启):load_dotenv(override=True)。不支持嵌套太深(如 ${${A}})或运行时命令替换。
PyCharm 运行配置中不能直接引用
PyCharm 的 “Environment Variables” 输入框里写 URL=https://${DOMAIN} 是无效的——它会原样传入,不做任何展开。这是 JVM 层限制,不是 bug。
✅ 正确做法:用 EnvFile 插件加载 .env 文件,并在代码中调用 load_dotenv(),让 python-dotenv 解析引用。
Python 代码中读取时手动拼接(备用方案)
如果不用 python-dotenv,或需要动态构造,可在 Python 中手动组合:
import oshost = os.environ.get("DB_HOST", "localhost")port = os.environ.get("DB_PORT", "5432")url = f"postgresql://user@{host}:{port}/mydb"
这种方式最可控,适合逻辑复杂或需校验的场景。









