为何os.getenv可读取.env中部分环境变量,却无法获取MYSQL_PASSWORD?
为何os.getenv可读取.env中部分环境变量,却无法获取MYSQL_PASSWORD?
这事儿其实大概率是环境变量的来源优先级在搞鬼,咱们一步步捋清楚:
首先得明确:Python的os.getenv()读取的是当前进程的环境变量,而.env文件里的变量默认不会自动进入进程环境——除非你用load_dotenv()把它加载进去。那为啥你不用load_dotenv()也能拿到CLIENT_ID和CLIENT_SECRET呢?
可能的原因有这几个:
- 这俩变量已经在系统/终端环境里存在了:比如你之前在终端里用
export CLIENT_ID=xxx命令设置过,或者你的IDE(比如PyCharm、VS Code)的运行配置里已经手动添加了这两个环境变量。这时候不管有没有.env文件,进程启动时就已经带着这俩变量了,自然能用os.getenv()读到。 - Flask CLI的特殊加载逻辑:你提到
.env里还有FLASK_APP变量,Flask的官方CLI工具(比如用flask run启动项目时)会自动读取.env文件来加载FLASK_APP这类核心配置,但它只会处理Flask相关的核心变量,不会把.env里所有变量都导入进程环境。所以你的CLIENT_ID和CLIENT_SECRET大概率还是属于第一种情况——已经在系统/终端环境里预先设置好了。
而MYSQL_PASSWORD只存在于你的.env文件里,既没有在终端export过,也没在IDE配置里设置,所以进程启动时环境里根本没有这个变量,自然os.getenv()拿不到。直到你调用load_dotenv(),把.env里的所有变量都加载进当前进程的环境,这时候os.getenv("MYSQL_PASSWORD")才能读到正确的值,数据库连接也就正常了。
你可以做个小测试验证一下:在调用load_dotenv()之前,打印os.environ(这是当前进程所有环境变量的字典),看看里面有没有CLIENT_ID、CLIENT_SECRET和MYSQL_PASSWORD——肯定前俩有,最后一个没有。
总结一下:os.getenv()不认识.env文件,它只认进程环境里的变量。那些不用load_dotenv()就能读到的变量,要么是系统/终端提前设置的,要么是被某些工具(比如Flask CLI)特殊处理过导入的;而MYSQL_PASSWORD只在.env里,必须手动用load_dotenv()加载才能被进程环境识别。
备注:内容来源于stack exchange,提问作者Viices
相关产品推荐
相关产品推荐

