METADATA
17.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
Metadata-Version: 2.1
Name: python-dotenv
Version: 0.14.0
Summary: Add .env support to your django/flask apps in development and deployments
Home-page: https://github.com/theskumar/python-dotenv
Author: Saurabh Kumar
Author-email: me+github@saurabh-kumar.com
License: UNKNOWN
Keywords: environment variables,deployments,settings,env,dotenv,configurations,python
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Topic :: System :: Systems Administration
Classifier: Topic :: Utilities
Classifier: Environment :: Web Environment
Description-Content-Type: text/markdown
Requires-Dist: typing ; python_version < "3.5"
Provides-Extra: cli
Requires-Dist: click (>=5.0) ; extra == 'cli'
```
_______ .__ __. ____ ____
| ____|| \ | | \ \ / /
| |__ | \| | \ \/ /
| __| | . ` | \ /
__ | |____ | |\ | \ /
(__)|_______||__| \__| \__/
```
python-dotenv | [](https://travis-ci.org/theskumar/python-dotenv) [](https://coveralls.io/r/theskumar/python-dotenv?branch=master) [](http://badge.fury.io/py/python-dotenv) [](https://saythanks.io/to/theskumar)
===============================================================================
Reads the key-value pair from `.env` file and adds them to environment
variable. It is great for managing app settings during development and
in production using [12-factor](http://12factor.net/) principles.
> Do one thing, do it well!
## Usages
The easiest and most common usage consists on calling `load_dotenv` when
the application starts, which will load environment variables from a
file named `.env` in the current directory or any of its parents or from
the path specificied; after that, you can just call the
environment-related method you need as provided by `os.getenv`.
`.env` looks like this:
```shell
# a comment that will be ignored.
REDIS_ADDRESS=localhost:6379
MEANING_OF_LIFE=42
MULTILINE_VAR="hello\nworld"
```
You can optionally prefix each line with the word `export`, which is totally ignored by this library, but might allow you to [`source`](https://bash.cyberciti.biz/guide/Source_command) the file in bash.
```
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
```
Python-dotenv can interpolate variables using POSIX variable expansion.
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.
Ensure that variables are surrounded with `{}` like `${HOME}` as bare
variables such as `$HOME` are not expanded.
```shell
CONFIG_PATH=${HOME}/.config/foo
DOMAIN=example.org
EMAIL=admin@${DOMAIN}
DEBUG=${DEBUG:-false}
```
## Getting started
Install the latest version with:
```shell
pip install -U python-dotenv
```
Assuming you have created the `.env` file along-side your settings
module.
.
├── .env
└── settings.py
Add the following code to your `settings.py`:
```python
# settings.py
from dotenv import load_dotenv
load_dotenv()
# OR, the same with increased verbosity
load_dotenv(verbose=True)
# OR, explicitly providing path to '.env'
from pathlib import Path # Python 3.6+ only
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)
```
At this point, parsed key/value from the `.env` file is now present as
system environment variable and they can be conveniently accessed via
`os.getenv()`:
```python
# settings.py
import os
SECRET_KEY = os.getenv("EMAIL")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")
```
`load_dotenv` does not override existing System environment variables. To
override, pass `override=True` to `load_dotenv()`.
`load_dotenv` also accepts `encoding` parameter to open the `.env` file. The default encoding is platform dependent (whatever `locale.getpreferredencoding()` returns), but any encoding supported by Python can be used. See the [codecs](https://docs.python.org/3/library/codecs.html#standard-encodings) module for the list of supported encodings.
You can use `find_dotenv()` method that will try to find a `.env` file
by (a) guessing where to start using `__file__` or the working directory
-- allowing this to work in non-file contexts such as IPython notebooks
and the REPL, and then (b) walking up the directory tree looking for the
specified file -- called `.env` by default.
```python
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
```
### In-memory filelikes
It is possible to not rely on the filesystem to parse filelikes from
other sources (e.g. from a network storage). `load_dotenv` and
`dotenv_values` accepts a filelike `stream`. Just be sure to rewind it
before passing.
```python
>>> 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'
```
The returned value is dictionary with key-value pairs.
`dotenv_values` could be useful if you need to *consume* the envfile but
not *apply* it directly into the system environment.
### Django
If you are using Django, you should add the above loader script at the
top of `wsgi.py` and `manage.py`.
## IPython Support
You can use dotenv with IPython. You can either let the dotenv search
for `.env` with `%dotenv` or provide the path to the `.env` file explicitly; see
below for usages.
%load_ext dotenv
# Use find_dotenv to locate the file
%dotenv
# Specify a particular file
%dotenv relative/or/absolute/path/to/.env
# Use '-o' to indicate override of existing variables
%dotenv -o
# Use '-v' to turn verbose mode on
%dotenv -v
## Command-line Interface
For command-line support, use the CLI option during installation:
```shell
pip install -U "python-dotenv[cli]"
```
A CLI interface `dotenv` is also included, which helps you manipulate
the `.env` file without manually opening it. The same CLI installed on
remote machine combined with fabric (discussed later) will enable you to
update your settings on a remote server; handy, isn't it!
```
Usage: dotenv [OPTIONS] COMMAND [ARGS]...
This script is used to set, get or unset values from a .env file.
Options:
-f, --file PATH Location of the .env file, defaults to .env
file in current working directory.
-q, --quote [always|never|auto]
Whether to quote or not the variable values.
Default mode is always. This does not affect
parsing.
--help Show this message and exit.
Commands:
get Retrive the value for the given key.
list Display all the stored key/value.
run Run command with environment variables from .env file present
set Store the given key/value.
unset Removes the given key.
```
### Setting config on Remote Servers
We make use of excellent [Fabric](http://www.fabfile.org/) to accomplish
this. Add a config task to your local fabfile; `dotenv_path` is the
location of the absolute path of `.env` file on the remote server.
```python
# fabfile.py
import dotenv
from fabric.api import task, run, env
# absolute path to the location of .env on remote server.
env.dotenv_path = '/opt/myapp/.env'
@task
def config(action=None, key=None, value=None):
'''Manage project configuration via .env
e.g: fab config:set,<key>,<value>
fab config:get,<key>
fab config:unset,<key>
fab config:list
'''
run('touch %(dotenv_path)s' % env)
command = dotenv.get_cli_string(env.dotenv_path, action, key, value)
run(command)
```
Usage is designed to mirror the Heroku config API very closely.
Get all your remote config info with `fab config`:
$ fab config
foo="bar"
Set remote config variables with `fab config:set,<key>,<value>`:
$ fab config:set,hello,world
Get a single remote config variables with `fab config:get,<key>`:
$ fab config:get,hello
Delete a remote config variables with `fab config:unset,<key>`:
$ fab config:unset,hello
Thanks entirely to fabric and not one bit to this project, you can chain
commands like so:
`fab config:set,<key1>,<value1> config:set,<key2>,<value2>`
$ fab config:set,hello,world config:set,foo,bar config:set,fizz=buzz
## 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-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)
## 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).
# 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).
## [Unreleased]
*No unreleased change at this time.*
## [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 Suport
([@tillahoffmann](https://github.com/tillahoffmann))
## 0.6.0
- Drop support for Python 2.6
- Handle escaped charaters 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
[@Flimm]: https://github.com/Flimm
[@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
[@cjauvin]: https://github.com/cjauvin
[@earlbread]: https://github.com/earlbread
[@ekohl]: https://github.com/ekohl
[@elbehery95]: https://github.com/elbehery95
[@gergelyk]: https://github.com/gergelyk
[@greyli]: https://github.com/greyli
[@qnighy]: https://github.com/qnighy
[@snobu]: https://github.com/snobu
[@techalchemy]: https://github.com/techalchemy
[@theskumar]: https://github.com/theskumar
[@ulyssessouza]: https://github.com/ulyssessouza
[@venthur]: https://github.com/venthur
[@yannham]: https://github.com/yannham
[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...HEAD
[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