Python环境变量配置的那些坑,我都踩过!

42 阅读2分钟

Python环境变量配置的那些坑,我都踩过!

相信不少朋友在用Python做项目的时候,都遇到过环境变量的各种奇葩问题。今天就聊聊我这些年积累下来的一些实用经验,希望能帮大家少走弯路。

第一个问题:环境变量互相打架怎么办? 这个问题我见过太多次了!你在本地配置了某个环境变量,结果程序运行时发现还是用的系统里那个老的值。这种情况下,load_dotenv(override=True)就是你的救星。具体操作很简单:在.env文件里把你需要的环境变量设置为空值,然后用这个参数重新加载,就能完美覆盖了。

多环境配置,这样管理更清爽 说到多环境配置,很多人喜欢把开发、测试、生产的配置都写在同一个文件里,结果配置文件变得越来越臃肿。我的建议是分文件管理:

from dotenv import load_dotenv
import os

# 根据运行环境自动选择配置文件
env = os.getenv("APP_ENV", "development")
if env == "development":
    load_dotenv(f".env.{env}")
elif env == "testing":
    load_dotenv(f".env.testing")

# 最后加载默认配置
load_dotenv() 

这样一来,每个环境的配置都井井有条,需要修改哪个环境就改对应的文件,不会互相干扰。

dotenv的加载顺序,这点很关键 很多人不知道dotenv的加载其实是有顺序的,了解这个能帮你解决很多奇怪的问题:

  1. 系统环境变量优先级最高
  2. override=True强制加载的变量
  3. 如果加载多个文件,后面的文件会覆盖前面的
  4. 同一个文件里,变量的定义顺序也有影响

这个顺序一定要记住,不然后面调试起来会很头疼。

环境变量的高级玩法:插值和表达式 最后分享一个比较实用的技巧:在.env文件里其实可以用插值!

BASE_URL="http://example.com"
HTTP_TIMEOUT=30
HTTP_RETRY_DELAY="${HTTP_TIMEOUT} * 2"

这样你在修改HTTP_TIMEOUT的时候,HTTP_RETRY_DELAY会自动跟着更新,是不是很方便?

写在最后 环境变量管理看似简单,但细节挺多的。我的建议是多实践几遍,遇到问题别急着百度,先理清楚dotenv的加载逻辑,这样积累的经验才是你的。