Python os.getenv无法读取DigitalOcean droplet上~/.profile定义的环境变量
问题原因
- 首先你缺少
export声明:~/.profile中直接写PRODUCTION=1定义的是shell本地变量,仅对当前shell进程生效,不会传递给shell启动的子进程(包括Python进程),只有加了export的变量才会成为全局环境变量被子进程继承。 - 其次
~/.profile仅对登录式shell生效:如果你的Python脚本是在非登录shell环境下运行(比如后台服务、非交互执行脚本、用su切换用户未加-l参数等场景),不会加载该配置文件,自然无法读取变量。如果你使用的默认shell不是bash(比如zsh),也不会默认加载~/.profile,会读取对应shell的专属配置文件。
你可以先在当前终端执行echo $PRODUCTION快速定位问题:如果输出为空,说明当前shell未加载配置;如果能输出1,就是缺少export导致的问题。
修复方案
直接修复当前配置
把~/.profile里的变量定义改成:
export PRODUCTION=1
修改后执行source ~/.profile让当前shell立即加载配置,再运行Python测试即可读取到变量。
替代的永久配置方案(不使用.profile)
按生效范围选择即可:
- 仅对当前用户所有shell生效:如果你用bash可以写入
~/.bashrc,用zsh写入~/.zshrc,变量前统一加export。 - 对系统所有用户全局生效:写入
/etc/environment,这个文件不需要加export,直接写PRODUCTION=1即可,系统登录时会自动为所有用户加载。 - 项目级隔离配置(更推荐,避免全局变量污染):在Python项目根目录新建
.env文件写入PRODUCTION=1,安装python-dotenv库后在脚本开头加载配置即可:from dotenv import load_dotenv load_dotenv() # 会自动读取当前目录下.env文件的变量
内容的提问来源于stack exchange,提问作者Milano
相关产品推荐
相关产品推荐

