动态等效于Python的“from <module> import <symbol>”

时间:2016-11-27 13:17:23

标签: python dynamic runtime python-import

在Python中,dynamically import an entire module using importlib.import_module(name)可以返回指定的包或模块(例如pkg.mod)。但是,没有类似的方法来动态导入特定的函数/类/等。来自给定模块的方式与使用例如from foo import bar, where the symbol bar of the module foo is imported into the symbol table of the importing module?

例如,如果我尝试使用importlib.import_module(symbol_name)直接导入符号,我只会获得ImportError:

import importlib

# Importing an entire module works fine
imported_module = importlib.import_module("os.path")
# This doesn't work
imported_symbol = importlib.import_module("os.path.basename")

执行上面的代码会打印以下堆栈跟踪:

Traceback (most recent call last):
  File "/home/stackoverflow/dev/importtest.py", line 6, in <module>
    symbol = importlib.import_module("basename", "os.path.basename")
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'basename'

2 个答案:

答案 0 :(得分:3)

您必须使用import_modulegetattr返回的模块对象中查找所需的符号:

imported_module = importlib.import_module("os.path")
imported_symbol = getattr(imported_module, "basename")

答案 1 :(得分:1)

import_module方法只接受模块。

您可以尝试使用以下内容访问模块的方法/属性

imported_symbol = importlib.import_module("os.path").basename