Python importlib import_module 模块的相对导入

6

根据这个答案,你可以使用importlib来进行相对导入,像这样:import_module

importlib.import_module('.c', 'a.b')

为什么相对导入在sklearn.feature_extraction.text中不起作用?
importlib.import_module('.text', 'sklearn.feature_extraction')

我确认text是一个模块,验证方法如下:

from types import ModuleType
import sklearn.feature_extraction.text
isinstance(sklearn.feature_extraction.text, ModuleType)

返回

True

编辑

“不起作用”指的是无法导入模块。

我正在使用Python 3.4版本。

绝对路径方法可行:

import importlib
text = importlib.import_module('sklearn.feature_extraction.text')
tfidf = text.TfidfVectorizer()

相对路径不能:

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

“不起作用”是什么意思? - cdonts
1个回答

4

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

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

这里有一个很好的解释:https://dev59.com/2WQn5IYBdhLWcg3wP1JT#28154841


1
那么 importlib.import_module() 的重点和目的是什么呢?如果我必须导入 sklearn.feature_extraction,为什么不直接在文件头部导入 sklearn.feature_extraction.text 呢?你有使用 importlib.import_module 的好用例吗? - Jarad
importlib仅提供Python代码中import语句的功能。 - jobou
@Jarad 在编写代码时可能不知道模块名称。例如,它可以从某个配置文件中读取。 - LogicDaemon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接