在 python 中导入模块
importing the module in python
我正在学习Python,在学习模块时,我想到了两个疑问。
疑问#1:
我知道模块只是简单的python文件,例如filename.py
,但是Python中的子模块是什么?
疑问#2:
考虑以下三行代码:
import modulename
from pkgname import modulename
from pkgname import *
所有三个语句都使用 __init__.py
(在 pkgname
包内)还是只使用第三个语句?
正如 Andrea Corbellini 在评论中所说:
- 子模块是包内的模块。 Python 包只是 Python 个包含
__init__.py
文件的模块的目录。
pkgname/__init__.py
每当您导入 pkgname 或其子模块之一(即示例的第 2 行和第 3 行)时都会使用。您的第一个示例不导入任何包或包模块,因此不需要使用 __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)
为了让你的第二个问题更清楚一些。
当你这样做时 -
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__
中列出的所有模块__init__.py
,如果该列表中没有列出任何模块,则 none 将被导入。例子-
假设我有
shared
-- __init__.py
-- a.py
__init__.py
看起来像 -
print("In Shared")
a.py
看起来像 -
print("In A")
现在在 shared
上面的目录中,打开 python,如果你这样做 -
from shared import *
它会打印出 -
In Shared
但是如果您将 __init__.py
中的代码更改为 -
print("In Shared")
__all__ = ['a']
然后从相同的位置进行相同的导入,它会打印出 -
In Shared
In A
如您所见,它只导入在 __all__
列表中定义的子模块。
最后,当你做 -
import modulename
假设您直接从 packagename
中执行此操作,方法是将目录更改为该目录并在那里打开 python 交互式解释器。那时,您没有要求 Python 为您导入 packagename,因此它不需要导入 packagename ,因此它不会导入 __init__.py
.
我正在学习Python,在学习模块时,我想到了两个疑问。
疑问#1:
我知道模块只是简单的python文件,例如
filename.py
,但是Python中的子模块是什么?疑问#2:
考虑以下三行代码:
import modulename from pkgname import modulename from pkgname import *
所有三个语句都使用
__init__.py
(在pkgname
包内)还是只使用第三个语句?
正如 Andrea Corbellini 在评论中所说:
- 子模块是包内的模块。 Python 包只是 Python 个包含
__init__.py
文件的模块的目录。 pkgname/__init__.py
每当您导入 pkgname 或其子模块之一(即示例的第 2 行和第 3 行)时都会使用。您的第一个示例不导入任何包或包模块,因此不需要使用__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)
为了让你的第二个问题更清楚一些。
当你这样做时 -
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__
中列出的所有模块__init__.py
,如果该列表中没有列出任何模块,则 none 将被导入。例子-
假设我有
shared
-- __init__.py
-- a.py
__init__.py
看起来像 -
print("In Shared")
a.py
看起来像 -
print("In A")
现在在 shared
上面的目录中,打开 python,如果你这样做 -
from shared import *
它会打印出 -
In Shared
但是如果您将 __init__.py
中的代码更改为 -
print("In Shared")
__all__ = ['a']
然后从相同的位置进行相同的导入,它会打印出 -
In Shared
In A
如您所见,它只导入在 __all__
列表中定义的子模块。
最后,当你做 -
import modulename
假设您直接从 packagename
中执行此操作,方法是将目录更改为该目录并在那里打开 python 交互式解释器。那时,您没有要求 Python 为您导入 packagename,因此它不需要导入 packagename ,因此它不会导入 __init__.py
.