使用python-dotenv进行高效的环境管理

1 python-dotenv 项目简介

  • 项目地址:https://github.com/theskumar/python-dotenv
  • 功能描述:从 .env 文件读取键值对,并将它们添加到环境变量中。
  • 核心理念:在项目中,可以将所有使用的环境变量写入 .env 文件,然后以键值对的方式读取作为环境变量。

2 用法

2.1 .env文件内容示例

# 这是一个注释,将被忽略
REDIS_ADDRESS=localhost:6379
MEANING_OF_LIFE=42
MULTILINE_VAR="hello\nworld"
  • 注意:使用 export 作为每行的前缀,python-dotenv 会忽略该变量,但可以使用 source 命令运行该文件。

2.2 项目中如何使用

安装

pip install -U python-dotenv

基本用法

确保项目目录下有 .env 文件,然后在 settings.py 中添加以下代码:

# settings.py
from dotenv import load_dotenv, find_dotenv
from pathlib import Path# 自动搜索 .env 文件
load_dotenv(verbose=True)# 或者指定 .env 文件位置
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path, verbose=True)

通过 load_dotenv,可以像访问系统环境变量一样使用 .env 文件中的变量,例如 os.getenv(key, default=None)

参数

  • dotenv_path: 指定.env文件路径,当然如果不传该参数的话(默认为None)也会自定调用dotenv.find_dotenv()去查找文件位置的,但是你的文件名如果不是.env那就必须传递该参数了
  • override: 当.env 文件中有变量与系统中原来的环境变量有冲突时,按照上面的取值顺序,默认使用系统变量,如果要用.env中的变量覆盖系统变量,可以给load_dotenv() 传递参数override=True此时只是临时使用了.env 中的变量值
  • encoding: load_dotenv() 也可以传递encoding 参数指定文件的编码方式。

从流对象加载

从可读的流对象中加载,记得把读指针调到要开始读取的位置。

>>> from io import StringIO     # Python2: from StringIO import StringIO
>>> from dotenv import dotenv_values
>>> filelike = StringIO('SPAM=EGGS\\n')
>>> filelike.seek(0)
>>> parsed = dotenv_values(stream=filelike)
>>> parsed['SPAM']
'EGGS'

注意:此时返回值是个字典


3 常见问题及解决方法

  1. 问题:在 virtualenv 中尝试通过 pip 安装时遇到的问题。
  • 解决方案:应该安装 python-dotenv,使用 pip3 install python-dotenvpip install python-dotenv
  1. 坑一:load_dotenv函数默认不会更新的配置项。

    官方文档的例子简单易懂。

    from dotenv import load_dotenv, find_dotenv
    load_dotenv(find_dotenv())
    

    然而这个例子里面缺隐藏了一个大坑。此时当用户在.env中更新配置项的值时,是不会生效的。原因是load_dotenv默认不会更新已经存在的配置项。推荐使用override参数,推荐代码如下:

    from dotenv import load_dotenv, find_dotenv
    load_dotenv(find_dotenv(), override=True)
    
  2. 坑二:env文件中# 的处理。

    考虑.env中的如下写法:

    BASEURL=http://codehub.com/#/python
    

    暂且不讨论在 url 中带#是否优雅。#在 url 中表示锚点,的确是会经常用到的;然而在Python中却是表示注释开始。此时BASEURL的值会是http://codehub.com/。以下写法均符合预期。

    BASEURL="<http://codehub.com/#/python>"
    BASEURL='<http://codehub.com/#/python>'
    

    需要使用双引号 / 单引号括起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RNA 37. SCI 文章中基于转录组计算肿瘤免疫浸润得分

这期推荐软件包 xCell:数字化描绘组织细胞异质性景观&#xff0c;通过它可以计算bulk 转录组的免疫浸润得分&#xff0c;下面我们就看看怎么来实现吧&#xff01; 简 介 组织是由许多细胞类型组成的复杂环境。在癌症领域&#xff0c;了解肿瘤微环境中的细胞异质性是一个新兴…

【css | loading】好看的loading特效

示例&#xff1a; https://code.juejin.cn/pen/7277764394618978365 html <div class"pl"><div class"pl__dot"></div><div class"pl__dot"></div><div class"pl__dot"></div><div c…

第51节:cesium 范围查询(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

Axure RP 10汉化版下载 Axure RP 10 mac授权码

Axure RP10汉化版是最强大的计划&#xff0c;原型设计和交付给开发人员的方法&#xff0c;而无需编写代码。能够制作逼真的&#xff0c;动态形式的原型。 Axure RP 10汉化版下载 Axure RP 10 mac授权码 RP 10有什么新功能&#xff1f; 1.显示动态面板 使用Axure RP 10&…

docker 镜像内执行命令显示:You requested GPUs: [0] But your machine only has: []

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在docker 镜像环境中&#xff0c;执行“docker exec -it container_name /bin/bash “进入容器之后&#xff0c;执行对应的python命令&#xff0c;显示You requested GPUs: [0] But your machine only…

【深度学习】P1 单层神经网络 - 线性回归(待完成)

单层神经网络 - 线性回归 线性回归基本要素1. 模型2. 模型训练3. 训练数据4. 损失函数5. 优化算法6. 模型预测 线性回归与神经网络1. 神经网络图 以一个简单的房屋价格预测为例&#xff0c;介绍解释线性回归这一单层神经网络。无需纠结于什么是单层神经网络&#xff0c;在本文的…

Hadoop_02

hadoop相比于传统文件系统的优点&#xff1a; 1.无限扩展 2.传统文件元数据分布在不同的机器上难以寻找&#xff0c;通过将元数据统一存放在一个服务器上解决 3.传统文件太大导致上传下载慢&#xff0c;通过分块并行上传到服务器解决 4.副本机制数据不容易丢失&#xff0c;解决…

python代码笔记230910

1.解释错误&#xff1a;TypeError: only integer scalar arrays can be converted to a scalar index 抱歉给出的解释有误。要返回列表中最小值的索引&#xff0c;可以使用index()方法。然而&#xff0c;当你尝试在列表中包含多个相同最小值时&#xff0c;index()方法可能会引…

JavaScript里面的二进制

概述 最近在做IOT设备配网开发的时候&#xff0c;处理了很多跟二进制、字节相关的事情&#xff0c;总结了一下JavaScript中有关二进制方面的一些知识点。 二进制和字节 首先&#xff0c;现代计算机是基于二进制的&#xff0c;从现代计算机电路来说&#xff0c;只有高电平/低电平…

Sql语句大全--查询

今天抽空整理下项目中的Sql语句* 项目中用到的Sql语句大全 Selcet 语句&#xff0c;有简有难 Selcet 语句&#xff0c;有简有难 基本的查询语句 select * from OLASCS.LLDC where CAPOLselect CATAX,CASU from OLASCS.LLDC where CAPOL IN (122345)SELECT EO,EANT, EAUS, sub…

TypeScript 中的 any、unknown、never 和 void

any any 表示 任意类型。 它是任意类型的父类&#xff0c;任意类型的值都可以赋予给 any 类型&#xff1a; // 编译不会报错 let anything: any 前端西瓜哥;let flag: boolean true; anything flag;anything { num: 2 };它可以表示任何类型&#xff0c;并使用它们的语法…

AIGC参数量节节攀升,对存储带来的挑战如何解决?

引言 近期&#xff0c;AIGC 相关产品如同雨后春笋一般不断涌现。但在技术层面&#xff0c;大家普遍的关注点更多集中在性能方面&#xff0c;却经常忽略了存储对推理和训练效率的影响&#xff0c;以及 AIGC 内容可能带来的合规风险。我们特邀腾讯云存储的产品负责人 崔剑老师和…

C++ QT qml 学习之 做个登录界面

最近在学习QT,也初探到qml 做ui 的灵活性与强大,于是手痒痒,做个demo 记录下学习成果 主要内容是如何自己编写一个按钮以及qml多窗口。 参考WX桌面版,做一个登录界面,这里面按钮是写的一个组合控件,有 按下,释放,以及正常 三种状态。 import QtQuick 2.0 import QtQ…

数据在内存中的存储——练习3

题目&#xff1a; 3.1 #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }3.2 #include <stdio.h> int main() {char a 128;printf("%u\n",a);return 0; }思路分析&#xff1a; 首先二者极其相似%u是无符号格式进行…

【Linux】—— 在Linux上进行读写文件操作

前言&#xff1a; 在之前&#xff0c;我已经对进程的相关知识进行了详细的介绍。本期开始&#xff0c;我们将要学习的是关于 “基础I/O”的知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;C文件接口 &#xff08;二&#xff09;系统文件I/O 1、接…

WebDAV之π-Disk派盘 + BubbleUPnP

BubbleUPnP是一款功能强大的Android播放器,支持UPnP/DLNA多屏互动。它可以将手机内容投屏到电视大屏上,与家人和朋友一起共享。此外,BubbleUPnP还提供了丰富的音乐和影视资源,您可以在线搜索并播放喜欢的内容。 以下是BubbleUPnP的一些主要特点: 1. 支持Chromecast和转码…

android java读写yaml文件

目录 申请读写权限&#xff1a; build.gradle中添加库引用&#xff1a; android java读写yaml文件 java修改yaml文件 YamlFile&#xff1a; 修改yaml文件方法2 Yaml&#xff1a; 删除值&#xff1a; 申请读写权限&#xff1a; <uses-permission android:name"and…

WebGL 绘制矩形

上一节绘制了圆点&#xff0c;调用的绘制方法如下&#xff1a;gl.drawArrays(gl.POINTS, 0, 1); 第一个参数明显是个枚举类型&#xff0c;肯定还有其他值&#xff0c;如下所示&#xff1a; POINTS 可视的点LINES 单独线段LINE_STRIP 线条LINE_LOOP 闭合线条TRIANGLES 单独三…

计算机网络篇之域名

计算机网络篇之域名 介绍 一个域名是一个由点分割的字符串序列&#xff0c;用于标识一组IP地址或互联网上的计算机&#xff0c;域名用于在因特网上标识和定位特定的网站或服务 组成 域名由两个主要部分组成&#xff1a;顶级域和二级域&#xff0c;顶级域是域名的最高级别&a…

Codeforces Round 895 (Div. 3) (A~G)

A. Two Vessels 题意&#xff1a;你有两个无限容量杯子A,B&#xff0c;分别装了a&#xff0c;b升的水&#xff0c;此外你还有一个容量为c的杯子C&#xff0c;你可以将一杯的水先倒入C中&#xff0c;再倒入另一个杯子&#xff0c;问你最少需要操作几次能使得A B杯的水量相同。 …