为何source .env后os.getenv无法读取环境变量?需export或python-dotenv?
为什么
source .env后Python脚本仍无法读取环境变量? 核心原因:Shell本地变量 vs 环境变量的作用域差异
当你执行source .env时,.env里的TEST='test'只是被设置成当前Shell的本地变量,这类变量仅存在于当前Shell进程中,不会被传递给它启动的子进程(比如你运行的python3 main.py就是Shell的子进程)。
终端能输出$TEST是因为你是在当前Shell进程里直接访问这个本地变量,但Python脚本作为子进程,只能继承父进程(Shell)的环境变量,而非本地变量,所以os.getenv和os.environ都找不到这个变量。
为什么export TEST=test有效?
export命令的作用是将Shell本地变量升级为环境变量。一旦变量被export,Shell会把它加入到自己的环境变量列表中,后续启动的所有子进程(包括Python)都会继承这份环境变量列表,Python的os模块自然就能读取到。
如果想让source .env直接生效,你可以修改.env文件,给变量加上export前缀:
export TEST='test'
这样source .env后,变量会直接成为环境变量,Python脚本也能正常读取。
为什么python-dotenv模块有效?
python-dotenv不走Shell环境变量传递的流程,它会直接读取.env文件的内容,手动将这些键值对加载到Python进程自己的os.environ字典中。相当于在Python内部完成了环境变量的设置,完全不依赖Shell的环境变量传递机制,所以不管Shell有没有设置对应的环境变量,Python都能读到。
内容的提问来源于stack exchange,提问作者Vyacheslav
相关产品推荐
相关产品推荐

