Python 如何在 dev、test、prod 中注入不同的环境变量

How to inject different environment variable in dev, test, prod in Python

我曾经使用 Flask,它提供了一种在不同模式下配置应用程序的简单方法 运行。 (开发、测试、生产……)

class BaseConfig:
    MY_PATH = "Something"

class DevelopmentConfig(BaseConfig):
    MY_PATH = "Something else"

# ...

我正在尝试构建类似但不使用 Flask 的东西。这是我能找到的最简单代码的结构:

-src
  - main.py
  - zip2h5
    - __init__.py
    - foo.py
-test
  - __init__.py
  - test_foo.py

对象 Foo.py 有一个方法 path,在开发模式下输出 "path/to/dev",在测试模式下输出 "path/to/test"。在代码中编写 if 语句会很混乱并且很难正确测试。使用环境变量似乎好多了。如何以及在哪里设置 Flask 所做的配置?

# foo.py
class Foo():

    def __init__(self, name):
        self.name = name

    def path(self):
        return "path/in/dev"

# test_foo.py
class TestFoo(unittest.TestCase):

    def test_path(self):
        boo = Foo("Boo")
        expected = "path/in/test"
        self.assertEquals(boo.path(), expected)

请不要告诉我我可以修补该方法。正如我所说,这只是一个例子。

您的进程的环境可通过 os module

您可以简单地为开发和测试用例中的路径注入不同的环境变量。我不确定你的 运行 测试如何,但通常你可以做类似 PATH='path/in/test' tests.sh 的事情来完成你需要的。

我使用 dotenv 并在我的项目根目录中保留 .env 文件来管理它。我有一个基础测试 class,它加载 .env.test 而不是 .env 来测试配置。

像 Flask 那样做。有多个 Config 类,然后将 env 作为参数传递,例如

class Foo():

    def __init__(self, name, env):
        self.name = name
        self.env = env

    def path(self):
      if self.env == 'TEST':
      #initialize TestConfig class here
         return TestConfigPath

test_foo.py

class TestFoo(unittest.TestCase):

    def test_path(self):
        boo = Foo("Boo")
        expected = "path/in/test"
        self.assertEquals(boo.path(), expected)