【问题标题】:Export variables from .env file and get them from os.environ without python-dotenv从 .env 文件导出变量并在没有 python-dotenv 的情况下从 os.environ 获取它们
【发布时间】:2023-02-23 22:15:00
【问题描述】:

我想在我的 python 脚本中使用几个环境变量。我创建了 .env 文件:

TEST='test'

然后创建main.py

import os
print(os.getenv("TEST"))
print(os.environ['TEST'])

在同一目录中执行:

$ source .env
$ echo $TEST
test

然后运行:

$ python3 main.py
None
Traceback (most recent call last):
  File "/Users/me/temp/pt/main.py", line 3, in <module>
    print(os.environ['TEST'])
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'TEST'

为什么在这种情况下os.getenv 不起作用,并且仅在export TEST=test 执行后或使用python-dotenv 模块后才起作用?

【问题讨论】:

    标签: python environment-variables


    【解决方案1】:

    TL;DR 不要使用 source 来处理 dotenv 文件;它们不是 shell 脚本。


    直接的问题是 source出口文件定义的任何变量;您只是定义了不会出现在新 Python 进程环境中的常规 shell 变量。

    您可以通过启用 -a 选项自动导出文件中定义的任何变量来解决这个问题。

    $ set -a
    $ source .env
    $ python3 main.py
    test
    test
    

    然而,这里更大的问题是.env文件是不是外壳脚本。 dotenv后面的引用规则不同。比较:

    $ cat .env
    TEST=test echo hello
    $ cat main.py
    import os
    import dotenv
    
    
    x = dotenv.dotenv_values('.env')
    
    print(os.getenv("TEST"))
    print(x['TEST'])
    $ set -a
    $ source .env
    hello
    $ python3 main.py
    None
    test echo hello
    

    源文件没有定义变量TEST;相反,它执行忽略 TEST 的值的 echo 命令仅为它是环境。

    使用dotenv 处理文件会生成一个名为TEST 的变量,并将其设置为完整的字符串test echo hello

    【讨论】:

      猜你喜欢
      • 2022-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多