Python importlib import_module 模块的相对导入

Jar*_*rad 6 python import python-3.x python-importlib

根据这个答案,您可以importlib使用import_module相对导入,如下所示:

importlib.import_module('.c', 'a.b')
Run Code Online (Sandbox Code Playgroud)

为什么相对导入对 sklearn.feature_extraction.text 不起作用?

importlib.import_module('.text', 'sklearn.feature_extraction')
Run Code Online (Sandbox Code Playgroud)

我验证了这text是一个模块:

from types import ModuleType
import sklearn.feature_extraction.text
isinstance(sklearn.feature_extraction.text, ModuleType)
Run Code Online (Sandbox Code Playgroud)

退货

True
Run Code Online (Sandbox Code Playgroud)

编辑

我所说的“不起作用”是指它不导入模块。

我正在使用Python 3.4

绝对方式有效:

import importlib
text = importlib.import_module('sklearn.feature_extraction.text')
tfidf = text.TfidfVectorizer()
Run Code Online (Sandbox Code Playgroud)

相对方式不会:

import importlib
text = importlib.import_module('.text', 'sklearn.feature_extraction')
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    text = importlib.import_module('.text', 'sklearn.feature_extraction')
  File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2249, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2199, in _sanity_check
SystemError: Parent module 'sklearn.feature_extraction' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)

job*_*bou 4

在尝试相对导入之前需要先导入父模块。

如果你想让它工作,你必须import sklearn.feature_extraction在调用 import_module 之前添加。

这里有很好的解释:https ://stackoverflow.com/a/28154841/1951430