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.a
和 aux2.b
一样访问 a
和 b
,但我想他们改为全局变量。为了做到这一点,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
的某些成员,您可以使用默认值为 None
的 getattr()
:
imports = ['obj1', 'obj2', 'obj3']
for name in imports:
value = getattr(package, name, None)
if value is not None:
globals()[name] = value
我想通过变量从库中导入所有对象。我知道如何从库中导入所有对象:
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.a
和 aux2.b
一样访问 a
和 b
,但我想他们改为全局变量。为了做到这一点,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
的某些成员,您可以使用默认值为 None
的 getattr()
:
imports = ['obj1', 'obj2', 'obj3']
for name in imports:
value = getattr(package, name, None)
if value is not None:
globals()[name] = value