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

Python无法读取source加载的.env环境变量问题咨询

为什么Python读取不到source .env加载的环境变量?

这问题其实是shell变量和环境变量的区别在搞鬼,我给你拆解清楚:

核心原因:未export的变量不会被子进程继承

当你在bash里执行source .env时,.env里的ENV=development只是被设置成了普通shell变量——这种变量只存在于当前bash进程里,不会被传递给它启动的子进程(比如你之后打开的Python解释器)。

而你手动执行export FOO=foo时,是把FOO标记成了环境变量,环境变量会被bash传递给所有子进程,所以Python能读取到它。

你可以在bash里验证这一点:执行source .env后,输入printenv ENV,会发现没有输出(因为ENV不是环境变量);但输入echo $ENV能看到值(因为它是当前shell的普通变量)。而printenv FOO会输出foo,因为它是环境变量。

解决办法

这里有几个实用的方案,你可以根据场景选:

  • 修改.env文件,给变量加上export
    直接在.env里的每个变量前加export:

    # .env文件内容
    export ENV=development
    

    之后再source .env,ENV就会变成环境变量,Python就能读取到了。

  • 临时让所有source的变量自动export
    如果不想修改.env文件,可以用bash的set -a命令(开启自动export模式),source后再关闭:

    set -a; source .env; set +a
    

    set -a会让之后定义的所有变量自动成为环境变量,set +a恢复默认行为,这样不需要修改.env也能让变量被子进程继承。

  • 用Python库直接加载.env文件
    更Pythonic的方式是用python-dotenv库,直接在代码里加载.env,不需要依赖shell的source操作:

    • 先安装库:
      pip install python-dotenv
      
    • 然后在Python代码里添加:
      import os
      from dotenv import load_dotenv
      
      load_dotenv()  # 加载.env文件里的变量
      print(os.getenv("ENV"))  # 现在就能输出development了
      

这样不管你是从哪个shell启动Python,都能读取到.env里的变量,还能避免依赖shell环境的问题。

内容的提问来源于stack exchange,提问作者Alexander Kleinhans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:27:56