python-dotenv


Namepython-dotenv JSON
Version 1.0.1 PyPI version JSON
download
home_pagehttps://github.com/theskumar/python-dotenv
SummaryRead key-value pairs from a .env file and set them as environment variables
upload_time2024-01-23 06:33:00
maintainer
docs_urlNone
authorSaurabh Kumar
requires_python>=3.8
licenseBSD-3-Clause
keywords environment variables deployments settings env dotenv configurations python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # python-dotenv

[![Build Status][build_status_badge]][build_status_link]
[![PyPI version][pypi_badge]][pypi_link]

Python-dotenv reads key-value pairs from a `.env` file and can set them as environment
variables. It helps in the development of applications following the
[12-factor](https://12factor.net/) principles.

- [Getting Started](#getting-started)
- [Other Use Cases](#other-use-cases)
  * [Load configuration without altering the environment](#load-configuration-without-altering-the-environment)
  * [Parse configuration as a stream](#parse-configuration-as-a-stream)
  * [Load .env files in IPython](#load-env-files-in-ipython)
- [Command-line Interface](#command-line-interface)
- [File format](#file-format)
  * [Multiline values](#multiline-values)
  * [Variable expansion](#variable-expansion)
- [Related Projects](#related-projects)
- [Acknowledgements](#acknowledgements)

## Getting Started

```shell
pip install python-dotenv
```

If your application takes its configuration from environment variables, like a 12-factor
application, launching it in development is not very practical because you have to set
those environment variables yourself.

To help you with that, you can add Python-dotenv to your application to make it load the
configuration from a `.env` file when it is present (e.g. in development) while remaining
configurable via the environment:

```python
from dotenv import load_dotenv

load_dotenv()  # take environment variables from .env.

# Code of your application, which uses environment variables (e.g. from `os.environ` or
# `os.getenv`) as if they came from the actual environment.
```

By default, `load_dotenv` doesn't override existing environment variables.

To configure the development environment, add a `.env` in the root directory of your
project:

```
.
├── .env
└── foo.py
```

The syntax of `.env` files supported by python-dotenv is similar to that of Bash:

```bash
# Development settings
DOMAIN=example.org
ADMIN_EMAIL=admin@${DOMAIN}
ROOT_URL=${DOMAIN}/app
```

If you use variables in values, ensure they are surrounded with `{` and `}`, like
`${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded.

You will probably want to add `.env` to your `.gitignore`, especially if it contains
secrets like a password.

See the section "File format" below for more information about what you can write in a
`.env` file.

## Other Use Cases

### Load configuration without altering the environment

The function `dotenv_values` works more or less the same way as `load_dotenv`, except it
doesn't touch the environment, it just returns a `dict` with the values parsed from the
`.env` file.

```python
from dotenv import dotenv_values

config = dotenv_values(".env")  # config = {"USER": "foo", "EMAIL": "foo@example.org"}
```

This notably enables advanced configuration management:

```python
import os
from dotenv import dotenv_values

config = {
    **dotenv_values(".env.shared"),  # load shared development variables
    **dotenv_values(".env.secret"),  # load sensitive variables
    **os.environ,  # override loaded values with environment variables
}
```

### Parse configuration as a stream

`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream`
argument.  It is thus possible to load the variables from sources other than the
filesystem (e.g. the network).

```python
from io import StringIO

from dotenv import load_dotenv

config = StringIO("USER=foo\nEMAIL=foo@example.org")
load_dotenv(stream=config)
```

### Load .env files in IPython

You can use dotenv in IPython.  By default, it will use `find_dotenv` to search for a
`.env` file:

```python
%load_ext dotenv
%dotenv
```

You can also specify a path:

```python
%dotenv relative/or/absolute/path/to/.env
```

Optional flags:

- `-o` to override existing variables.
- `-v` for increased verbosity.

## Command-line Interface

A CLI interface `dotenv` is also included, which helps you manipulate the `.env` file
without manually opening it.

```shell
$ pip install "python-dotenv[cli]"
$ dotenv set USER foo
$ dotenv set EMAIL foo@example.org
$ dotenv list
USER=foo
EMAIL=foo@example.org
$ dotenv list --format=json
{
  "USER": "foo",
  "EMAIL": "foo@example.org"
}
$ dotenv run -- python foo.py
```

Run `dotenv --help` for more information about the options and subcommands.

## File format

The format is not formally specified and still improves over time.  That being said,
`.env` files should mostly look like Bash files.

Keys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted.
Spaces before and after keys, equal signs, and values are ignored. Values can be followed
by a comment.  Lines can start with the `export` directive, which does not affect their
interpretation.

Allowed escape sequences:

- in single-quoted values: `\\`, `\'`
- in double-quoted values: `\\`, `\'`, `\"`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v`

### Multiline values

It is possible for single- or double-quoted values to span multiple lines.  The following
examples are equivalent:

```bash
FOO="first line
second line"
```

```bash
FOO="first line\nsecond line"
```

### Variable without a value

A variable can have no value:

```bash
FOO
```

It results in `dotenv_values` associating that variable name with the value `None` (e.g.
`{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables.

This shouldn't be confused with `FOO=`, in which case the variable is associated with the
empty string.

### Variable expansion

Python-dotenv can interpolate variables using POSIX variable expansion.

With `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the
first of the values defined in the following list:

- Value of that variable in the `.env` file.
- Value of that variable in the environment.
- Default value, if provided.
- Empty string.

With `load_dotenv(override=False)`, the value of a variable is the first of the values
defined in the following list:

- Value of that variable in the environment.
- Value of that variable in the `.env` file.
- Default value, if provided.
- Empty string.

## Related Projects

-   [Honcho](https://github.com/nickstenning/honcho) - For managing
    Procfile-based applications.
-   [django-dotenv](https://github.com/jpadilla/django-dotenv)
-   [django-environ](https://github.com/joke2k/django-environ)
-   [django-environ-2](https://github.com/sergeyklay/django-environ-2)
-   [django-configuration](https://github.com/jezdez/django-configurations)
-   [dump-env](https://github.com/sobolevn/dump-env)
-   [environs](https://github.com/sloria/environs)
-   [dynaconf](https://github.com/rochacbruno/dynaconf)
-   [parse_it](https://github.com/naorlivne/parse_it)
-   [python-decouple](https://github.com/HBNetwork/python-decouple)

## Acknowledgements

This project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and
[Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible
without the support of these [awesome
people](https://github.com/theskumar/python-dotenv/graphs/contributors).

[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg
[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml
[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg
[pypi_link]: https://badge.fury.io/py/python-dotenv
[python_streams]: https://docs.python.org/3/library/io.html

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.0.1] - 2024-01-23

**Fixed**

* Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma])
* Allow modules using load_dotenv to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton])
* Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133])

**Misc**
* Use pathlib.Path in tests ([#466] by [@eumiro])
* Fix year in release date in changelog.md ([#454] by [@jankislinger])
* Use https in README links ([#474] by [@Nicals])

## [1.0.0] - 2023-02-24

**Fixed**

* Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar])
* Handle situations where the cwd does not exist. (#446 by [@jctanner])

## [0.21.1] - 2023-01-21

**Added**

* Use Python 3.11 non-beta in CI (#438 by [@bbc2])
* Modernize variables code (#434 by [@Nougat-Waffle])
* Modernize main.py and parser.py code (#435 by [@Nougat-Waffle])
* Improve conciseness of cli.py and __init__.py (#439 by [@Nougat-Waffle])
* Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2])
* Updated License to align with BSD OSI template (#433 by [@lsmith77])


**Fixed**

* Fix Out-of-scope error when "dest" variable is undefined (#413 by [@theGOTOguy])
* Fix IPython test warning about deprecated `magic` (#440 by [@bbc2])
* Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf])

## [0.21.0] - 2022-09-03

**Added**

* CLI: add support for invocations via 'python -m'. (#395 by [@theskumar])
* `load_dotenv` function now returns `False`. (#388 by [@larsks])
* CLI: add --format= option to list command. (#407 by [@sammck])

**Fixed**

* Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants])
* Use `open` instead of `io.open`. (#389 by [@rabinadk1])
* Improve documentation for variables without a value (#390 by [@bbc2])
* Add `parse_it` to Related Projects (#410 by [@naorlivne])
* Update README.md (#415 by [@harveer07])
* Improve documentation with direct use of MkDocs (#398 by [@bbc2])

## [0.20.0] - 2022-03-24

**Added**

- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`.
  (#379 by [@bbc2])

**Fixed**

- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by
  [@mgorny]).
- Don't build universal wheels (#387 by [@bbc2]).

## [0.19.2] - 2021-11-11

**Fixed**

- In `set_key`, add missing newline character before new entry if necessary. (#361 by
  [@bbc2])

## [0.19.1] - 2021-08-09

**Added**

- Add support for Python 3.10. (#359 by [@theskumar])

## [0.19.0] - 2021-07-24

**Changed**

- Require Python 3.5 or a later version.  Python 2 and 3.4 are no longer supported. (#341
  by [@bbc2]).

**Added**

- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str,
  os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]).
- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream
  (`IO[str]`), which includes values like `io.StringIO("foo")` and `open("file.env",
  "r")` (#348 by [@bbc2]).

## [0.18.0] - 2021-06-20

**Changed**

- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in
  `set_key` (#330 by [@bbc2]).
- When writing a value to a .env file with `set_key` or `dotenv set <key> <value>` (#330
  by [@bbc2]):
  - Use single quotes instead of double quotes.
  - Don't strip surrounding quotes.
  - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters
    (as determined by `string.isalnum`).

## [0.17.1] - 2021-04-29

**Fixed**

- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]).

## [0.17.0] - 2021-04-02

**Changed**

- Make `dotenv get <key>` only show the value, not `key=value` (#313 by [@bbc2]).

**Added**

- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]).

## [0.16.0] - 2021-03-27

**Changed**

- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is
  now `"utf-8"` instead of `None` (#306 by [@bbc2]).
- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]).

## [0.15.0] - 2020-10-28

**Added**

- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by
  [@jadutter]).

**Changed**

- Make `set` command create the `.env` file in the current directory if no `.env` file was
  found (#270 by [@jadutter]).

**Fixed**

- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]).
- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]).
- Fix parsing of unquoted values containing several adjacent space or tab characters
  (#277 by [@bbc2], review by [@x-yuri]).

## [0.14.0] - 2020-07-03

**Changed**

- Privilege definition in file over the environment in variable expansion (#256 by
  [@elbehery95]).

**Fixed**

- Improve error message for when file isn't found (#245 by [@snobu]).
- Use HTTPS URL in package meta data (#251 by [@ekohl]).

## [0.13.0] - 2020-04-16

**Added**

- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]).

## [0.12.0] - 2020-02-28

**Changed**

- Use current working directory to find `.env` when bundled by PyInstaller (#213 by
  [@gergelyk]).

**Fixed**

- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]).
- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]).
- Remove warning when last line is empty (#238 by [@bbc2]).

## [0.11.0] - 2020-02-07

**Added**

- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation
  (#232 by [@ulyssessouza]).

**Changed**

- Use logging instead of warnings (#231 by [@bbc2]).

**Fixed**

- Fix installation in non-UTF-8 environments (#225 by [@altendky]).
- Fix PyPI classifiers (#228 by [@bbc2]).

## [0.10.5] - 2020-01-19

**Fixed**

- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]):
  - Don't print warning when key has no value.
  - Reject more malformed lines (e.g. "A: B", "a='b',c").
- Fix handling of lines with just a comment (#224 by [@bbc2]).

## [0.10.4] - 2020-01-17

**Added**

- Make typing optional (#179 by [@techalchemy]).
- Print a warning on malformed line (#211 by [@bbc2]).
- Support keys without a value (#220 by [@ulyssessouza]).

## 0.10.3

- Improve interactive mode detection ([@andrewsmith])([#183]).
- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]).
  - Interpret escapes as control characters only in double-quoted strings.
  - Interpret `#` as start of comment only if preceded by whitespace.

## 0.10.2

- Add type hints and expose them to users ([@qnighy])([#172])
- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None`
  ([@theskumar])([@earlbread])([#161])
- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121])
- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176])

## 0.10.1
- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158])

## 0.10.0

- Add support for UTF-8 in unquoted values ([@bbc2])([#148])
- Add support for trailing comments ([@bbc2])([#148])
- Add backslashes support in values ([@bbc2])([#148])
- Add support for newlines in values ([@bbc2])([#148])
- Force environment variables to str with Python2 on Windows ([@greyli])
- Drop Python 3.3 support ([@greyli])
- Fix stderr/-out/-in redirection ([@venthur])


## 0.9.0

- Add `--version` parameter to cli ([@venthur])
- Enable loading from current directory ([@cjauvin])
- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur])

## 0.8.1

-   Add tests for docs ([@Flimm])
-   Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar])

## 0.8.0

-   `set_key` and `unset_key` only modified the affected file instead of
    parsing and re-writing file, this causes comments and other file
    entact as it is.
-   Add support for `export` prefix in the line.
-   Internal refractoring ([@theskumar])
-   Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78])

## 0.7.1

-   Remove hard dependency on iPython ([@theskumar])

## 0.7.0

-   Add support to override system environment variable via .env.
    ([@milonimrod](https://github.com/milonimrod))
    ([\#63](https://github.com/theskumar/python-dotenv/issues/63))
-   Disable ".env not found" warning by default
    ([@maxkoryukov](https://github.com/maxkoryukov))
    ([\#57](https://github.com/theskumar/python-dotenv/issues/57))

## 0.6.5

-   Add support for special characters `\`.
    ([@pjona](https://github.com/pjona))
    ([\#60](https://github.com/theskumar/python-dotenv/issues/60))

## 0.6.4

-   Fix issue with single quotes ([@Flimm])
    ([\#52](https://github.com/theskumar/python-dotenv/issues/52))

## 0.6.3

-   Handle unicode exception in setup.py
    ([\#46](https://github.com/theskumar/python-dotenv/issues/46))

## 0.6.2

-   Fix dotenv list command ([@ticosax](https://github.com/ticosax))
-   Add iPython Support
    ([@tillahoffmann](https://github.com/tillahoffmann))

## 0.6.0

-   Drop support for Python 2.6
-   Handle escaped characters and newlines in quoted values. (Thanks
    [@iameugenejo](https://github.com/iameugenejo))
-   Remove any spaces around unquoted key/value. (Thanks
    [@paulochf](https://github.com/paulochf))
-   Added POSIX variable expansion. (Thanks
    [@hugochinchilla](https://github.com/hugochinchilla))

## 0.5.1

-   Fix find\_dotenv - it now start search from the file where this
    function is called from.

## 0.5.0

-   Add `find_dotenv` method that will try to find a `.env` file.
    (Thanks [@isms](https://github.com/isms))

## 0.4.0

-   cli: Added `-q/--quote` option to control the behaviour of quotes
    around values in `.env`. (Thanks
    [@hugochinchilla](https://github.com/hugochinchilla)).
-   Improved test coverage.

[#78]: https://github.com/theskumar/python-dotenv/issues/78
[#121]: https://github.com/theskumar/python-dotenv/issues/121
[#148]: https://github.com/theskumar/python-dotenv/issues/148
[#158]: https://github.com/theskumar/python-dotenv/issues/158
[#170]: https://github.com/theskumar/python-dotenv/issues/170
[#172]: https://github.com/theskumar/python-dotenv/issues/172
[#176]: https://github.com/theskumar/python-dotenv/issues/176
[#183]: https://github.com/theskumar/python-dotenv/issues/183
[#359]: https://github.com/theskumar/python-dotenv/issues/359
[#469]: https://github.com/theskumar/python-dotenv/issues/469
[#456]: https://github.com/theskumar/python-dotenv/issues/456
[#466]: https://github.com/theskumar/python-dotenv/issues/466
[#454]: https://github.com/theskumar/python-dotenv/issues/454
[#474]: https://github.com/theskumar/python-dotenv/issues/474

[@alanjds]: https://github.com/alanjds
[@altendky]: https://github.com/altendky
[@andrewsmith]: https://github.com/andrewsmith
[@asyncee]: https://github.com/asyncee
[@bbc2]: https://github.com/bbc2
[@befeleme]: https://github.com/befeleme
[@cjauvin]: https://github.com/cjauvin
[@eaf]: https://github.com/eaf
[@earlbread]: https://github.com/earlbread
[@eggplants]: https://github.com/@eggplants
[@ekohl]: https://github.com/ekohl
[@elbehery95]: https://github.com/elbehery95
[@eumiro]: https://github.com/eumiro
[@Flimm]: https://github.com/Flimm
[@freddyaboulton]: https://github.com/freddyaboulton
[@gergelyk]: https://github.com/gergelyk
[@gongqingkui]: https://github.com/gongqingkui
[@greyli]: https://github.com/greyli
[@harveer07]: https://github.com/@harveer07
[@jadutter]: https://github.com/jadutter
[@jankislinger]: https://github.com/jankislinger
[@jctanner]: https://github.com/jctanner
[@larsks]: https://github.com/@larsks
[@lsmith77]: https://github.com/lsmith77
[@mgorny]: https://github.com/mgorny
[@naorlivne]: https://github.com/@naorlivne
[@Nicals]: https://github.com/Nicals
[@Nougat-Waffle]: https://github.com/Nougat-Waffle
[@qnighy]: https://github.com/qnighy
[@Qwerty-133]: https://github.com/Qwerty-133
[@rabinadk1]: https://github.com/@rabinadk1
[@sammck]: https://github.com/@sammck
[@samwyma]: https://github.com/samwyma
[@snobu]: https://github.com/snobu
[@techalchemy]: https://github.com/techalchemy
[@theGOTOguy]: https://github.com/theGOTOguy
[@theskumar]: https://github.com/theskumar
[@ulyssessouza]: https://github.com/ulyssessouza
[@venthur]: https://github.com/venthur
[@x-yuri]: https://github.com/x-yuri
[@yannham]: https://github.com/yannham
[@zueve]: https://github.com/zueve


[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...HEAD
[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1
[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0
[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1
[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0
[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0
[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2
[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1
[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0
[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0
[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1
[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0
[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0
[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0
[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0
[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0
[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0
[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0
[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5
[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/theskumar/python-dotenv",
    "name": "python-dotenv",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "environment variables,deployments,settings,env,dotenv,configurations,python",
    "author": "Saurabh Kumar",
    "author_email": "me+github@saurabh-kumar.com",
    "download_url": "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz",
    "platform": null,
    "description": "# python-dotenv\n\n[![Build Status][build_status_badge]][build_status_link]\n[![PyPI version][pypi_badge]][pypi_link]\n\nPython-dotenv reads key-value pairs from a `.env` file and can set them as environment\nvariables. It helps in the development of applications following the\n[12-factor](https://12factor.net/) principles.\n\n- [Getting Started](#getting-started)\n- [Other Use Cases](#other-use-cases)\n  * [Load configuration without altering the environment](#load-configuration-without-altering-the-environment)\n  * [Parse configuration as a stream](#parse-configuration-as-a-stream)\n  * [Load .env files in IPython](#load-env-files-in-ipython)\n- [Command-line Interface](#command-line-interface)\n- [File format](#file-format)\n  * [Multiline values](#multiline-values)\n  * [Variable expansion](#variable-expansion)\n- [Related Projects](#related-projects)\n- [Acknowledgements](#acknowledgements)\n\n## Getting Started\n\n```shell\npip install python-dotenv\n```\n\nIf your application takes its configuration from environment variables, like a 12-factor\napplication, launching it in development is not very practical because you have to set\nthose environment variables yourself.\n\nTo help you with that, you can add Python-dotenv to your application to make it load the\nconfiguration from a `.env` file when it is present (e.g. in development) while remaining\nconfigurable via the environment:\n\n```python\nfrom dotenv import load_dotenv\n\nload_dotenv()  # take environment variables from .env.\n\n# Code of your application, which uses environment variables (e.g. from `os.environ` or\n# `os.getenv`) as if they came from the actual environment.\n```\n\nBy default, `load_dotenv` doesn't override existing environment variables.\n\nTo configure the development environment, add a `.env` in the root directory of your\nproject:\n\n```\n.\n\u251c\u2500\u2500 .env\n\u2514\u2500\u2500 foo.py\n```\n\nThe syntax of `.env` files supported by python-dotenv is similar to that of Bash:\n\n```bash\n# Development settings\nDOMAIN=example.org\nADMIN_EMAIL=admin@${DOMAIN}\nROOT_URL=${DOMAIN}/app\n```\n\nIf you use variables in values, ensure they are surrounded with `{` and `}`, like\n`${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded.\n\nYou will probably want to add `.env` to your `.gitignore`, especially if it contains\nsecrets like a password.\n\nSee the section \"File format\" below for more information about what you can write in a\n`.env` file.\n\n## Other Use Cases\n\n### Load configuration without altering the environment\n\nThe function `dotenv_values` works more or less the same way as `load_dotenv`, except it\ndoesn't touch the environment, it just returns a `dict` with the values parsed from the\n`.env` file.\n\n```python\nfrom dotenv import dotenv_values\n\nconfig = dotenv_values(\".env\")  # config = {\"USER\": \"foo\", \"EMAIL\": \"foo@example.org\"}\n```\n\nThis notably enables advanced configuration management:\n\n```python\nimport os\nfrom dotenv import dotenv_values\n\nconfig = {\n    **dotenv_values(\".env.shared\"),  # load shared development variables\n    **dotenv_values(\".env.secret\"),  # load sensitive variables\n    **os.environ,  # override loaded values with environment variables\n}\n```\n\n### Parse configuration as a stream\n\n`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream`\nargument.  It is thus possible to load the variables from sources other than the\nfilesystem (e.g. the network).\n\n```python\nfrom io import StringIO\n\nfrom dotenv import load_dotenv\n\nconfig = StringIO(\"USER=foo\\nEMAIL=foo@example.org\")\nload_dotenv(stream=config)\n```\n\n### Load .env files in IPython\n\nYou can use dotenv in IPython.  By default, it will use `find_dotenv` to search for a\n`.env` file:\n\n```python\n%load_ext dotenv\n%dotenv\n```\n\nYou can also specify a path:\n\n```python\n%dotenv relative/or/absolute/path/to/.env\n```\n\nOptional flags:\n\n- `-o` to override existing variables.\n- `-v` for increased verbosity.\n\n## Command-line Interface\n\nA CLI interface `dotenv` is also included, which helps you manipulate the `.env` file\nwithout manually opening it.\n\n```shell\n$ pip install \"python-dotenv[cli]\"\n$ dotenv set USER foo\n$ dotenv set EMAIL foo@example.org\n$ dotenv list\nUSER=foo\nEMAIL=foo@example.org\n$ dotenv list --format=json\n{\n  \"USER\": \"foo\",\n  \"EMAIL\": \"foo@example.org\"\n}\n$ dotenv run -- python foo.py\n```\n\nRun `dotenv --help` for more information about the options and subcommands.\n\n## File format\n\nThe format is not formally specified and still improves over time.  That being said,\n`.env` files should mostly look like Bash files.\n\nKeys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted.\nSpaces before and after keys, equal signs, and values are ignored. Values can be followed\nby a comment.  Lines can start with the `export` directive, which does not affect their\ninterpretation.\n\nAllowed escape sequences:\n\n- in single-quoted values: `\\\\`, `\\'`\n- in double-quoted values: `\\\\`, `\\'`, `\\\"`, `\\a`, `\\b`, `\\f`, `\\n`, `\\r`, `\\t`, `\\v`\n\n### Multiline values\n\nIt is possible for single- or double-quoted values to span multiple lines.  The following\nexamples are equivalent:\n\n```bash\nFOO=\"first line\nsecond line\"\n```\n\n```bash\nFOO=\"first line\\nsecond line\"\n```\n\n### Variable without a value\n\nA variable can have no value:\n\n```bash\nFOO\n```\n\nIt results in `dotenv_values` associating that variable name with the value `None` (e.g.\n`{\"FOO\": None}`. `load_dotenv`, on the other hand, simply ignores such variables.\n\nThis shouldn't be confused with `FOO=`, in which case the variable is associated with the\nempty string.\n\n### Variable expansion\n\nPython-dotenv can interpolate variables using POSIX variable expansion.\n\nWith `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the\nfirst of the values defined in the following list:\n\n- Value of that variable in the `.env` file.\n- Value of that variable in the environment.\n- Default value, if provided.\n- Empty string.\n\nWith `load_dotenv(override=False)`, the value of a variable is the first of the values\ndefined in the following list:\n\n- Value of that variable in the environment.\n- Value of that variable in the `.env` file.\n- Default value, if provided.\n- Empty string.\n\n## Related Projects\n\n-   [Honcho](https://github.com/nickstenning/honcho) - For managing\n    Procfile-based applications.\n-   [django-dotenv](https://github.com/jpadilla/django-dotenv)\n-   [django-environ](https://github.com/joke2k/django-environ)\n-   [django-environ-2](https://github.com/sergeyklay/django-environ-2)\n-   [django-configuration](https://github.com/jezdez/django-configurations)\n-   [dump-env](https://github.com/sobolevn/dump-env)\n-   [environs](https://github.com/sloria/environs)\n-   [dynaconf](https://github.com/rochacbruno/dynaconf)\n-   [parse_it](https://github.com/naorlivne/parse_it)\n-   [python-decouple](https://github.com/HBNetwork/python-decouple)\n\n## Acknowledgements\n\nThis project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and\n[Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible\nwithout the support of these [awesome\npeople](https://github.com/theskumar/python-dotenv/graphs/contributors).\n\n[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg\n[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml\n[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg\n[pypi_link]: https://badge.fury.io/py/python-dotenv\n[python_streams]: https://docs.python.org/3/library/io.html\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this\nproject adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [1.0.1] - 2024-01-23\n\n**Fixed**\n\n* Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma])\n* Allow modules using load_dotenv to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton])\n* Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133])\n\n**Misc**\n* Use pathlib.Path in tests ([#466] by [@eumiro])\n* Fix year in release date in changelog.md ([#454] by [@jankislinger])\n* Use https in README links ([#474] by [@Nicals])\n\n## [1.0.0] - 2023-02-24\n\n**Fixed**\n\n* Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar])\n* Handle situations where the cwd does not exist. (#446 by [@jctanner])\n\n## [0.21.1] - 2023-01-21\n\n**Added**\n\n* Use Python 3.11 non-beta in CI (#438 by [@bbc2])\n* Modernize variables code (#434 by [@Nougat-Waffle])\n* Modernize main.py and parser.py code (#435 by [@Nougat-Waffle])\n* Improve conciseness of cli.py and __init__.py (#439 by [@Nougat-Waffle])\n* Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2])\n* Updated License to align with BSD OSI template (#433 by [@lsmith77])\n\n\n**Fixed**\n\n* Fix Out-of-scope error when \"dest\" variable is undefined (#413 by [@theGOTOguy])\n* Fix IPython test warning about deprecated `magic` (#440 by [@bbc2])\n* Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf])\n\n## [0.21.0] - 2022-09-03\n\n**Added**\n\n* CLI: add support for invocations via 'python -m'. (#395 by [@theskumar])\n* `load_dotenv` function now returns `False`. (#388 by [@larsks])\n* CLI: add --format= option to list command. (#407 by [@sammck])\n\n**Fixed**\n\n* Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants])\n* Use `open` instead of `io.open`. (#389 by [@rabinadk1])\n* Improve documentation for variables without a value (#390 by [@bbc2])\n* Add `parse_it` to Related Projects (#410 by [@naorlivne])\n* Update README.md (#415 by [@harveer07])\n* Improve documentation with direct use of MkDocs (#398 by [@bbc2])\n\n## [0.20.0] - 2022-03-24\n\n**Added**\n\n- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`.\n  (#379 by [@bbc2])\n\n**Fixed**\n\n- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by\n  [@mgorny]).\n- Don't build universal wheels (#387 by [@bbc2]).\n\n## [0.19.2] - 2021-11-11\n\n**Fixed**\n\n- In `set_key`, add missing newline character before new entry if necessary. (#361 by\n  [@bbc2])\n\n## [0.19.1] - 2021-08-09\n\n**Added**\n\n- Add support for Python 3.10. (#359 by [@theskumar])\n\n## [0.19.0] - 2021-07-24\n\n**Changed**\n\n- Require Python 3.5 or a later version.  Python 2 and 3.4 are no longer supported. (#341\n  by [@bbc2]).\n\n**Added**\n\n- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str,\n  os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]).\n- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream\n  (`IO[str]`), which includes values like `io.StringIO(\"foo\")` and `open(\"file.env\",\n  \"r\")` (#348 by [@bbc2]).\n\n## [0.18.0] - 2021-06-20\n\n**Changed**\n\n- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in\n  `set_key` (#330 by [@bbc2]).\n- When writing a value to a .env file with `set_key` or `dotenv set <key> <value>` (#330\n  by [@bbc2]):\n  - Use single quotes instead of double quotes.\n  - Don't strip surrounding quotes.\n  - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters\n    (as determined by `string.isalnum`).\n\n## [0.17.1] - 2021-04-29\n\n**Fixed**\n\n- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]).\n\n## [0.17.0] - 2021-04-02\n\n**Changed**\n\n- Make `dotenv get <key>` only show the value, not `key=value` (#313 by [@bbc2]).\n\n**Added**\n\n- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]).\n\n## [0.16.0] - 2021-03-27\n\n**Changed**\n\n- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is\n  now `\"utf-8\"` instead of `None` (#306 by [@bbc2]).\n- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]).\n\n## [0.15.0] - 2020-10-28\n\n**Added**\n\n- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by\n  [@jadutter]).\n\n**Changed**\n\n- Make `set` command create the `.env` file in the current directory if no `.env` file was\n  found (#270 by [@jadutter]).\n\n**Fixed**\n\n- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]).\n- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]).\n- Fix parsing of unquoted values containing several adjacent space or tab characters\n  (#277 by [@bbc2], review by [@x-yuri]).\n\n## [0.14.0] - 2020-07-03\n\n**Changed**\n\n- Privilege definition in file over the environment in variable expansion (#256 by\n  [@elbehery95]).\n\n**Fixed**\n\n- Improve error message for when file isn't found (#245 by [@snobu]).\n- Use HTTPS URL in package meta data (#251 by [@ekohl]).\n\n## [0.13.0] - 2020-04-16\n\n**Added**\n\n- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]).\n\n## [0.12.0] - 2020-02-28\n\n**Changed**\n\n- Use current working directory to find `.env` when bundled by PyInstaller (#213 by\n  [@gergelyk]).\n\n**Fixed**\n\n- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]).\n- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]).\n- Remove warning when last line is empty (#238 by [@bbc2]).\n\n## [0.11.0] - 2020-02-07\n\n**Added**\n\n- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation\n  (#232 by [@ulyssessouza]).\n\n**Changed**\n\n- Use logging instead of warnings (#231 by [@bbc2]).\n\n**Fixed**\n\n- Fix installation in non-UTF-8 environments (#225 by [@altendky]).\n- Fix PyPI classifiers (#228 by [@bbc2]).\n\n## [0.10.5] - 2020-01-19\n\n**Fixed**\n\n- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]):\n  - Don't print warning when key has no value.\n  - Reject more malformed lines (e.g. \"A: B\", \"a='b',c\").\n- Fix handling of lines with just a comment (#224 by [@bbc2]).\n\n## [0.10.4] - 2020-01-17\n\n**Added**\n\n- Make typing optional (#179 by [@techalchemy]).\n- Print a warning on malformed line (#211 by [@bbc2]).\n- Support keys without a value (#220 by [@ulyssessouza]).\n\n## 0.10.3\n\n- Improve interactive mode detection ([@andrewsmith])([#183]).\n- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]).\n  - Interpret escapes as control characters only in double-quoted strings.\n  - Interpret `#` as start of comment only if preceded by whitespace.\n\n## 0.10.2\n\n- Add type hints and expose them to users ([@qnighy])([#172])\n- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None`\n  ([@theskumar])([@earlbread])([#161])\n- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121])\n- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176])\n\n## 0.10.1\n- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158])\n\n## 0.10.0\n\n- Add support for UTF-8 in unquoted values ([@bbc2])([#148])\n- Add support for trailing comments ([@bbc2])([#148])\n- Add backslashes support in values ([@bbc2])([#148])\n- Add support for newlines in values ([@bbc2])([#148])\n- Force environment variables to str with Python2 on Windows ([@greyli])\n- Drop Python 3.3 support ([@greyli])\n- Fix stderr/-out/-in redirection ([@venthur])\n\n\n## 0.9.0\n\n- Add `--version` parameter to cli ([@venthur])\n- Enable loading from current directory ([@cjauvin])\n- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur])\n\n## 0.8.1\n\n-   Add tests for docs ([@Flimm])\n-   Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar])\n\n## 0.8.0\n\n-   `set_key` and `unset_key` only modified the affected file instead of\n    parsing and re-writing file, this causes comments and other file\n    entact as it is.\n-   Add support for `export` prefix in the line.\n-   Internal refractoring ([@theskumar])\n-   Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78])\n\n## 0.7.1\n\n-   Remove hard dependency on iPython ([@theskumar])\n\n## 0.7.0\n\n-   Add support to override system environment variable via .env.\n    ([@milonimrod](https://github.com/milonimrod))\n    ([\\#63](https://github.com/theskumar/python-dotenv/issues/63))\n-   Disable \".env not found\" warning by default\n    ([@maxkoryukov](https://github.com/maxkoryukov))\n    ([\\#57](https://github.com/theskumar/python-dotenv/issues/57))\n\n## 0.6.5\n\n-   Add support for special characters `\\`.\n    ([@pjona](https://github.com/pjona))\n    ([\\#60](https://github.com/theskumar/python-dotenv/issues/60))\n\n## 0.6.4\n\n-   Fix issue with single quotes ([@Flimm])\n    ([\\#52](https://github.com/theskumar/python-dotenv/issues/52))\n\n## 0.6.3\n\n-   Handle unicode exception in setup.py\n    ([\\#46](https://github.com/theskumar/python-dotenv/issues/46))\n\n## 0.6.2\n\n-   Fix dotenv list command ([@ticosax](https://github.com/ticosax))\n-   Add iPython Support\n    ([@tillahoffmann](https://github.com/tillahoffmann))\n\n## 0.6.0\n\n-   Drop support for Python 2.6\n-   Handle escaped characters and newlines in quoted values. (Thanks\n    [@iameugenejo](https://github.com/iameugenejo))\n-   Remove any spaces around unquoted key/value. (Thanks\n    [@paulochf](https://github.com/paulochf))\n-   Added POSIX variable expansion. (Thanks\n    [@hugochinchilla](https://github.com/hugochinchilla))\n\n## 0.5.1\n\n-   Fix find\\_dotenv - it now start search from the file where this\n    function is called from.\n\n## 0.5.0\n\n-   Add `find_dotenv` method that will try to find a `.env` file.\n    (Thanks [@isms](https://github.com/isms))\n\n## 0.4.0\n\n-   cli: Added `-q/--quote` option to control the behaviour of quotes\n    around values in `.env`. (Thanks\n    [@hugochinchilla](https://github.com/hugochinchilla)).\n-   Improved test coverage.\n\n[#78]: https://github.com/theskumar/python-dotenv/issues/78\n[#121]: https://github.com/theskumar/python-dotenv/issues/121\n[#148]: https://github.com/theskumar/python-dotenv/issues/148\n[#158]: https://github.com/theskumar/python-dotenv/issues/158\n[#170]: https://github.com/theskumar/python-dotenv/issues/170\n[#172]: https://github.com/theskumar/python-dotenv/issues/172\n[#176]: https://github.com/theskumar/python-dotenv/issues/176\n[#183]: https://github.com/theskumar/python-dotenv/issues/183\n[#359]: https://github.com/theskumar/python-dotenv/issues/359\n[#469]: https://github.com/theskumar/python-dotenv/issues/469\n[#456]: https://github.com/theskumar/python-dotenv/issues/456\n[#466]: https://github.com/theskumar/python-dotenv/issues/466\n[#454]: https://github.com/theskumar/python-dotenv/issues/454\n[#474]: https://github.com/theskumar/python-dotenv/issues/474\n\n[@alanjds]: https://github.com/alanjds\n[@altendky]: https://github.com/altendky\n[@andrewsmith]: https://github.com/andrewsmith\n[@asyncee]: https://github.com/asyncee\n[@bbc2]: https://github.com/bbc2\n[@befeleme]: https://github.com/befeleme\n[@cjauvin]: https://github.com/cjauvin\n[@eaf]: https://github.com/eaf\n[@earlbread]: https://github.com/earlbread\n[@eggplants]: https://github.com/@eggplants\n[@ekohl]: https://github.com/ekohl\n[@elbehery95]: https://github.com/elbehery95\n[@eumiro]: https://github.com/eumiro\n[@Flimm]: https://github.com/Flimm\n[@freddyaboulton]: https://github.com/freddyaboulton\n[@gergelyk]: https://github.com/gergelyk\n[@gongqingkui]: https://github.com/gongqingkui\n[@greyli]: https://github.com/greyli\n[@harveer07]: https://github.com/@harveer07\n[@jadutter]: https://github.com/jadutter\n[@jankislinger]: https://github.com/jankislinger\n[@jctanner]: https://github.com/jctanner\n[@larsks]: https://github.com/@larsks\n[@lsmith77]: https://github.com/lsmith77\n[@mgorny]: https://github.com/mgorny\n[@naorlivne]: https://github.com/@naorlivne\n[@Nicals]: https://github.com/Nicals\n[@Nougat-Waffle]: https://github.com/Nougat-Waffle\n[@qnighy]: https://github.com/qnighy\n[@Qwerty-133]: https://github.com/Qwerty-133\n[@rabinadk1]: https://github.com/@rabinadk1\n[@sammck]: https://github.com/@sammck\n[@samwyma]: https://github.com/samwyma\n[@snobu]: https://github.com/snobu\n[@techalchemy]: https://github.com/techalchemy\n[@theGOTOguy]: https://github.com/theGOTOguy\n[@theskumar]: https://github.com/theskumar\n[@ulyssessouza]: https://github.com/ulyssessouza\n[@venthur]: https://github.com/venthur\n[@x-yuri]: https://github.com/x-yuri\n[@yannham]: https://github.com/yannham\n[@zueve]: https://github.com/zueve\n\n\n[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...HEAD\n[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1\n[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0\n[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1\n[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0\n[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0\n[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2\n[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1\n[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0\n[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0\n[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1\n[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0\n[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0\n[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0\n[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0\n[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0\n[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0\n[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0\n[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5\n[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4\n",
    "bugtrack_url": null,
    "license": "BSD-3-Clause",
    "summary": "Read key-value pairs from a .env file and set them as environment variables",
    "version": "1.0.1",
    "project_urls": {
        "Homepage": "https://github.com/theskumar/python-dotenv"
    },
    "split_keywords": [
        "environment variables",
        "deployments",
        "settings",
        "env",
        "dotenv",
        "configurations",
        "python"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6a3eb68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082",
                "md5": "be2ee069abf0a751940ae8674a7bd91e",
                "sha256": "f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"
            },
            "downloads": -1,
            "filename": "python_dotenv-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "be2ee069abf0a751940ae8674a7bd91e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 19863,
            "upload_time": "2024-01-23T06:32:58",
            "upload_time_iso_8601": "2024-01-23T06:32:58.246675Z",
            "url": "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bc57e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58",
                "md5": "68abb78e05460ce558ca255de550e1ea",
                "sha256": "e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"
            },
            "downloads": -1,
            "filename": "python-dotenv-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "68abb78e05460ce558ca255de550e1ea",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 39115,
            "upload_time": "2024-01-23T06:33:00",
            "upload_time_iso_8601": "2024-01-23T06:33:00.505983Z",
            "url": "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-23 06:33:00",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "theskumar",
    "github_project": "python-dotenv",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "python-dotenv"
}
        
Elapsed time: 0.35026s