Python无法读取source加载的.env环境变量问题咨询
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 +aset -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

