2016-11-27 68 views
2

在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' 
+0

'itertools'沒有'import_module()'。你提到的鏈接包含'importlib.import_module'。 – ettanany

+0

謝謝;我修正了錯字。不知道我是如何管理那個... – errantlinguist

回答

3

你有在import_module使用getattr返回的模塊對象中查找您需要的符號:

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

import_module方法只接受模塊。

你可以試試下面的東西來訪問模塊的方法/屬性

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