Python: 通过变量从库中导入所有对象

Python: Import all objects from library by variable

我想通过变量从库中导入所有对象。我知道如何从库中导入所有对象:

from package import *

我知道如何通过变量导入库:

import importlib

var = 'package'
package = importlib.import_module(var)

但是,我不知道如何将这两个目标结合起来。看起来 importlib.import 不支持这个。有人可以帮忙吗?

注意:我知道以这种方式绕过命名空间的危险(任何对我的查询使用潜在答案的人都应该熟悉这些危险)。我只打算用它来快速开发和测试一些算法,并计划发布我的代码,其中包含我文件中各个对象的明确名称。

编辑:我想出了一个最小的例子。假设我在同一个目录下有三个文件:

aux1.py

var = 'aux2'

aux2.py

a = 0
b = 1

main.py

import importlib

from aux1 import var
aux2 = importlib.import_module(var)

如果我 运行 main.py,我可以像 aux2.aaux2.b 一样访问 ab,但我想他们改为全局变量。为了做到这一点,main.py 的最后一行需要什么?

import_module(name, package=None):
    """Import a module.
    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.
    """

这是import_module(...)方法的初始化。在名称后添加逗号并放置锚点的位置(引用文件的起始文件夹;例如“C:\Program Files\Java”)。第二个参数基本上和你的一样,只使用绝对路径。

您可以遍历从 import_module 返回的模块的 __dict__ 属性,如果该项目不是以 __ 开头,则将该项目添加到 globals()

import importlib

var = 'package'
package = importlib.import_module(var)

for name, value in package.__dict__.items():
    if not name.startswith("__"):
        globals()[name] = value

如果您只想导入 package 的某些成员,您可以使用默认值为 Nonegetattr():

imports = ['obj1', 'obj2', 'obj3']
for name in imports:
    value = getattr(package, name, None)
    if value is not None:
        globals()[name] = value