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

时间:2019-04-08 16:13:25

标签: python-3.x python-importlib

我有一个主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 *

此代码段返回以下错误:ModuleNotFoundError: No module named 'client_config'

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

1 个答案:

答案 0 :(得分:1)

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

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 的身份访问客户端的配置,并避免客户端的配置文件覆盖主配置文件中的值。