我正在学习Python,在学习模块时,我想到了两个疑问。
怀疑#1:
我知道该模块只是简单的python文件,例如filename.py
,但Python中的子模块是什么?
怀疑#2:
考虑以下三行代码:
import modulename
from pkgname import modulename
from pkgname import *
这三个语句是使用__init__.py
(在pkgname
包内)还是仅使用第三个语句?
答案 0 :(得分:4)
让你的第二个问题更加清晰。
当你这样做时 -
import packagename.modulename
或
from packagename import modulename
Python内部首先导入packagename
,当我说python导入packagename
时,我的意思是它导入该包的__init__.py
,然后导入modulename
。这就是为什么当您执行上述任何操作时,它会导入__init__.py
。
当你这样做时 -
from packagename import *
请注意,默认情况下,这不会从packagename导入modulename
,这只会从packagename中导入__init__.py
,而__all__
列出的所有模块都列在{{ 1}},如果该列表中没有列出任何模块,则不会导入任何模块。示例 -
让我说我有
__init__.py
shared
-- __init__.py
-- a.py
看起来像 -
__init__.py
print("In Shared")
看起来像 -
a.py
现在在print("In A")
上面的目录中,打开python,如果你这样做 -
shared
它会打印出来 -
from shared import *
但是如果您将In Shared
中的代码更改为 -
__init__.py
从相同的位置进行相同的导入,它会打印出来 -
print("In Shared")
__all__ = ['a']
如您所见,它只导入In Shared
In A
列表中定义的子模块。
最后,当你这样做时 -
__all__
让我们说你直接从import modulename
内部做到这一点,通过改变目录并在那里打开python交互式解释器。那时候,你不是要求Python为你导入packagename,所以它不需要导入packagename,因此它不会导入packagename
。
答案 1 :(得分:3)
Andrea Corbellini在评论中说:
__init__.py
文件的Python模块目录。pkgname/__init__.py
。您的第一个示例不会导入包的任何包或模块,因此它不需要使用__init__.py
(可以为空)如果有这些文件,并且您正在处理同一文件夹
./pkgname/__init__.py # Submodule of pkgname package used on example 3) to import all the submodules
./pkgname/Asdf.py # Submodule of pkgname package
./pkgname/modulename.py # Submodule of pkgname package imported in example 2) using __init__.py
./modulname.py # Module imported on example 1)