Ubuntu 20.04下Python/Django读取os.environ自定义环境变量返回None问题
问题核心原因
- 配置生效操作错误
你执行~/.profile的方式无法让环境变量作用到当前运行的shell:直接执行脚本会开启一个独立的子shell运行配置内容,子shell里的环境变量不会同步到父级shell,只有执行source ~/.profile或者. ~/.profile才能让配置的变量在当前shell会话生效。 - 环境变量的作用范围限制
即使你用正确的source命令加载了配置,变量也仅在当前执行source的终端会话中生效:
- 如果你启动Django服务使用的是另一个终端会话、或者重启过终端,变量会失效
- 如果你的Django服务是用systemd、supervisor等托管工具后台运行,或者切换了其他用户(比如www-data)运行服务,进程无法继承当前普通用户会话的环境变量
- 虚拟环境的隔离特性
从你的终端前缀(env)可以看出你使用了Python虚拟环境,虚拟环境激活时不会主动加载当前用户的.profile配置,如果你是在激活虚拟环境后才修改的.profile,没有重新加载虚拟环境或者重新source配置的话,虚拟环境的运行环境中也不会存在该变量。
对应解决方案
- 本地开发临时测试:在启动Django服务的同一终端内执行
source ~/.profile,之后再启动Django服务即可读取到变量 - 持久化生效(适配所有运行场景):更推荐在Django项目根目录新建
.env文件存储自定义环境变量,安装python-dotenv包后在settings.py中加载该文件的配置,不需要依赖系统用户的profile配置,避免不同运行环境的适配问题。
内容的提问来源于stack exchange,提问作者feldo badix
相关产品推荐
相关产品推荐

