首页 > 解决方案 > 从灵活定义的模块中导入所有变量

问题描述

我有一个主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 根本不支持这种导入?

标签: python-3.xpython-importlib

解决方案


调用import_module已经导入客户端配置。from client_config import *假设这client_config是您尝试导入的模块的名称,即使您事先创建了一个变量,也import os将导入该模块:osos

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


推荐阅读