如果我这样做:
import lxml
在Python中,lxml.html
没有被导入。例如,我无法调用lxml.html.parse()
函数。为什么会这样?
如果我这样做:
import lxml
在Python中,lxml.html
没有被导入。例如,我无法调用lxml.html.parse()
函数。为什么会这样?
在Python中导入模块或包是一个概念上很简单的操作:
查找与导入对应的.py文件。这涉及到Python路径和一些其他机制,但最终会找到一个特定的.py文件。
对于每个导入的目录级别(例如import foo.bar.baz
有两个级别),找到相应的__init__.py
文件并执行它。执行它就是运行文件中所有顶层语句。
最后,执行.py文件本身(在这种情况下为foo/bar/baz.py
),这意味着执行所有顶层语句。由该执行创建的所有全局变量都打包到一个模块对象中,并且该模块对象是导入的结果。
如果没有任何步骤导入子包,则这些子包不可用。如果导入了子包,则它们是可用的。包作者可以按照自己的意愿进行设置。
__init__.py
文件都为空,这样的导入也能正常工作。请同时查看我发布的问题:https://stackoverflow.com/questions/57772706/importing-deeply-nested-modules-in-python - z33k这是有意为之的。该包在其__init__.py
中有导入嵌套包的选项,因此您可以轻松访问嵌套包。这是包作者的选择问题,目的是最小化您可能不会使用的代码量。
lxml
是一个包,而不是一个模块。包是模块的集合。恰好地,你也可以直接导入该包,但这并不会自动导入其所有子模块。
至于为什么,那就是BDFL的问题了。我认为这可能是因为包通常相当大,导入所有子模块将会产生过大的性能损失。
这是为了只加载最少量的代码,以便于使用多部分库时不必全部加载。例如,您可能不会使用 lxml
的 html
部分,因此不想处理加载其代码的问题。
import os
允许你在代码中使用os.path.whatever
。所以这取决于模块的作者。 - Greg Hewgill