从灵活定义的模块中导入所有变量

Importing all variables from a flexibly defined module

我有一个主 config.py 文件,然后是特定的客户端配置文件,例如client1_config.py.

我想做的是将我的 client1_config.py 文件中的所有变量导入到我的 config.py 文件中。问题是我想根据环境变量在运行时灵活地执行此操作。它看起来像这样:

import os
import importlib

client = os.environ['CLIENT']
client_config = importlib.import_module(
    '{client}_config'.format(
        client=client))
from client_config import *

此代码段returns出现以下错误:ModuleNotFoundError: No module named 'client_config'

是否有可能(以及如何)实现我正在尝试做的事情,或者 Python 根本不支持这种导入?

import_module 的调用已经导入了客户端配置。 from client_config import * 假定 client_config 是您要导入的模块的名称,就像 import os 将导入模块 os 即使您创建变量 os 事先:

os = "sys"
import os  # still imports the os module, not the sys module

下面,假设我们有一个 client1_config.py,它只包含一个变量:

dummy = True

要将其元素添加到 config.py 的主命名空间以便您可以直接访问它们,您可以执行以下操作:

import importlib

client = "client1"

# Import the client's configuration
client_config = importlib.import_module(f"{client}_config")
print(client_config.dummy)  # True

# Add all elements from client_config
# to the main namespace:
globals().update({v: getattr(client_config, v)
                  for v in client_config.__dict__
                  if not v.startswith("_")})
print(dummy)  # True

但是,为了清楚起见,我建议以 config.client 访问客户端的配置,并避免客户端的配置文件覆盖主配置文件中的值。