关于导入:python导入只提供顶级模块

Python __import__ is only giving me top level module

本问题已经有最佳答案,请猛点这里访问。

我正在做

1
module = __import__("client.elements.gui.button", globals(), locals(), [], 0)

但它只是返回client

我的问题是什么?


这就是__import__所做的。

When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned, not the module named by name.

实际上不应该使用__import__;如果要动态导入模块,请使用importlib.import_module


接受的答案是正确的,但是如果你在文档中继续阅读,你会发现,使用__import__这样一个令人不安的"黑客"可以解决这个问题:

1
module = __import__('client.elements.gui.button', fromlist=[''])

只要它是一个非空的列表,你给fromlist输入什么并不重要。这将向默认的__import__实现发出信号,表示您要执行from x.y.z import foo样式的导入,它将返回您要使用的模块。

如前所述,您应该使用importlib,但如果需要支持小于2.7的Python版本,这仍然是一个解决方案。


它只获得最高级别,但您也可以这样处理:

1
2
3
4
5
6
7
module_name = 'some.module.import.class'
    module = __import__(module_name)
    for n in module_name.split('.')[1:]:
        module = getattr(module, n)

# module is now equal to what would normally
# have been retrieved where you to properly import the file