在Python中动态加载模块中的所有名称

时间:2015-03-03 07:17:39

标签: python python-3.x

如何from some.module import *在字符串变量中定义模块的名称?

2 个答案:

答案 0 :(得分:2)

此代码导入os的所有符号:

import importlib
# Load the module as `module'
module = importlib.import_module("os")
# Now extract the attributes into the locals() namespace, as `from .. 
# import *' would do
if hasattr(module, "__all__"):
    # A module can define __all__ to explicitly define which names
    # are imported by the `.. import *' statement
    attrs = { key: getattr(module, key) for key in module.__all__ }
else:
    # Otherwise, the statement imports all names that do not start with
    # an underscore
    attrs = { key: value for key, value in module.__dict__.items() if
              key[0] != "_" }
# Copy the attibutes into the locals() namespace
locals().update(attrs)

参见例如this question有关from ... import *操作背后逻辑的更多信息。

现在虽然这有效,但使用此代码。从命名模块导入所有符号已经被认为是不好的做法,但使用用户给定的名称执行此操作肯定会更糟。如果您需要提示可能出现的问题,请搜索PHP的register_globals

答案 1 :(得分:0)

在Python中,内置的 import 函数实现与使用import语句相同的目标,但它是一个实际的函数,它以字符串作为参数。

sys = __import__('sys')

变量sys现在是sys模块,就像你说过import sys。

Reference