Python模块和Python包之间有什么区别?
另请参阅:“包”和“模块”之间的区别(对于其他语言)
Python模块和Python包之间有什么区别?
另请参阅:“包”和“模块”之间的区别(对于其他语言)
当前回答
这里的其他答案可能仍然有点模糊,所以我希望发布一个更清晰的答案。需要注意的是,问题的标题一开始也有点误导,我认为更好的标题是:“与常规模块相比,包模块有什么特别之处?”。
TL;DR-简短回答:
包也是模块,但它们是其中的一种特殊类型。特别之处在于1。它们是“目录”和2。它们可能包含特殊文件,如__init__.py和__main__.py。
更好地理解-更长的答案:
重点是,包是一种特殊类型的模块,因此我们需要首先从总体上了解模块,然后包模块的特殊之处也会有意义。(注意:我有时会在这个答案中将“包模块”称为“包”,反之亦然)
因此,让我们先从总体上讨论模块,因为它不那么模糊/更容易理解。我们对模块做的基本上有两件事,要么在其他模块中导入它们,要么直接用Python执行它们。
导入模块有一个明显的目标,即访问模块内部的内容。
然而,执行模块通常追求以下两个目标之一:
该模块是一个主模块,执行它将启动我们的程序(或其子程序之一)。我们希望单独尝试该模块的功能,即无需先导入。
让我们通过一些示例来了解所有这些:
导入模块:
# bar.py
def talk():
print("bar")
# foo.py
import bar # <-- importing module "bar"
bar.talk() # <-- prints "bar"
执行模块
目标1,将模块作为主要模块执行:
让我们假设上面示例中的foo.py模块是启动程序的主模块。我们可以通过在终端中键入以下命令来运行它:python3foo.py#<--执行一个主模块,然后它将启动我们的程序。
目标2,单独尝试模块的功能:
假设我们想在上面的示例中尝试bar.py模块中的函数talk,而不运行整个程序,即不调用foo.py模块。为此,我们必须稍微更改bar.py:
# bar.py
def talk():
print("bar")
if __name__ == '__main__':
talk()
现在在终端中运行这个命令:python3bar.py#<--单独尝试模块的功能,然后它将打印条。
现在,我们知道了如何处理模块,让我们回到主要问题:
与常规模块相比,包模块有什么特别之处?
1.Python中的常规模块只是“文件”,而包模块则是“目录”。
2.常规模块可以“导入”并且可以“执行”(如上面的示例所示),包模块也可以“导入“并且可以“运行”,然而,您可能会正确地抱怨:“但是我们不能直接在目录中编写代码!代码只在文件中编写!”,这确实是一个很好的抱怨,因为它导致了包模块的第二个特殊之处。包模块的代码是在其目录中的文件中编写的,这些文件的名称也是Python保留的。如果要“导入”一个包模块,则必须将其代码放在其目录中的__init__.py文件中;如果要“执行”包模块,必须将其执行代码放在目录中的___main__.py文件夹中。
下面是上面解释的最后一个例子:
# hierarchy of files and folders:
.
├── bar_pack/
│ ├── __init__.py
│ ├── __main__.py
│ foo.py
# bar_pack/__init__.py
def talk():
print("bar")
# bar_pack/__main__.py
import __init__
__init__.talk()
# foo.py
import bar_pack # <-- importing package module "bar_pack"
bar_pack.talk() # <-- prints "bar"
# Run this command in the terminal:
python3 bar_pack # <-- executing the package module "bar_pack", prints "bar"
其他回答
这里的其他答案可能仍然有点模糊,所以我希望发布一个更清晰的答案。需要注意的是,问题的标题一开始也有点误导,我认为更好的标题是:“与常规模块相比,包模块有什么特别之处?”。
TL;DR-简短回答:
包也是模块,但它们是其中的一种特殊类型。特别之处在于1。它们是“目录”和2。它们可能包含特殊文件,如__init__.py和__main__.py。
更好地理解-更长的答案:
重点是,包是一种特殊类型的模块,因此我们需要首先从总体上了解模块,然后包模块的特殊之处也会有意义。(注意:我有时会在这个答案中将“包模块”称为“包”,反之亦然)
因此,让我们先从总体上讨论模块,因为它不那么模糊/更容易理解。我们对模块做的基本上有两件事,要么在其他模块中导入它们,要么直接用Python执行它们。
导入模块有一个明显的目标,即访问模块内部的内容。
然而,执行模块通常追求以下两个目标之一:
该模块是一个主模块,执行它将启动我们的程序(或其子程序之一)。我们希望单独尝试该模块的功能,即无需先导入。
让我们通过一些示例来了解所有这些:
导入模块:
# bar.py
def talk():
print("bar")
# foo.py
import bar # <-- importing module "bar"
bar.talk() # <-- prints "bar"
执行模块
目标1,将模块作为主要模块执行:
让我们假设上面示例中的foo.py模块是启动程序的主模块。我们可以通过在终端中键入以下命令来运行它:python3foo.py#<--执行一个主模块,然后它将启动我们的程序。
目标2,单独尝试模块的功能:
假设我们想在上面的示例中尝试bar.py模块中的函数talk,而不运行整个程序,即不调用foo.py模块。为此,我们必须稍微更改bar.py:
# bar.py
def talk():
print("bar")
if __name__ == '__main__':
talk()
现在在终端中运行这个命令:python3bar.py#<--单独尝试模块的功能,然后它将打印条。
现在,我们知道了如何处理模块,让我们回到主要问题:
与常规模块相比,包模块有什么特别之处?
1.Python中的常规模块只是“文件”,而包模块则是“目录”。
2.常规模块可以“导入”并且可以“执行”(如上面的示例所示),包模块也可以“导入“并且可以“运行”,然而,您可能会正确地抱怨:“但是我们不能直接在目录中编写代码!代码只在文件中编写!”,这确实是一个很好的抱怨,因为它导致了包模块的第二个特殊之处。包模块的代码是在其目录中的文件中编写的,这些文件的名称也是Python保留的。如果要“导入”一个包模块,则必须将其代码放在其目录中的__init__.py文件中;如果要“执行”包模块,必须将其执行代码放在目录中的___main__.py文件夹中。
下面是上面解释的最后一个例子:
# hierarchy of files and folders:
.
├── bar_pack/
│ ├── __init__.py
│ ├── __main__.py
│ foo.py
# bar_pack/__init__.py
def talk():
print("bar")
# bar_pack/__main__.py
import __init__
__init__.talk()
# foo.py
import bar_pack # <-- importing package module "bar_pack"
bar_pack.talk() # <-- prints "bar"
# Run this command in the terminal:
python3 bar_pack # <-- executing the package module "bar_pack", prints "bar"
模块是在一次导入下导入并使用的单个文件。例如
import my_module
包是提供包层次结构的目录中的模块集合。
from my_package.timing.danger.internets import function_of_love
模块文档
软件包简介
迟来的答案,还有另一个定义:
包由导入的顶级实体表示,该顶级实体可以是一个独立模块,或__init__.py特殊模块作为子目录结构中的一组模块中的顶级实体。
因此,包实际上是一个分发单元,它提供一个或多个模块。
模块:模块是一个简单的Python文件,扩展名为(.py),包含函数和全局变量的集合。它是一个可执行文件,Python中的Package概念用于排列所有模块。
例如:将代码保存在名为demo(module.py)的文件中。
def myModule1(name):
print("My Module name is: "+ name)
导入演示模块模块并在其中使用myModule1函数。
import demo_module
demo_module.myModule1("Math")
解决方案:
我的模块名称是:数学
包:包是包含模块集合的基本目录。该目录包含Python模块以及一个(__init.py__)文件,解释器使用该文件将其识别为包。该包只不过是一个命名空间。在包中,有子包。
例如:
学生(套餐)
|__init__.py(构造函数)
|details.py(模块)
|marks.py(模块)
|collegeDetails.py(模块)
|demo_module.py(模块)
包是一组组织成目录以形成包目录的模块。
from Student import details, collegeDetails, demo_module
从Python词汇表中:
重要的是要记住,所有包都是模块,但并非所有模块都是包。换句话说,包只是一种特殊的模块。具体来说,任何包含__path__属性的模块都被视为包。
名称中带有破折号的Python文件(如my-file.py)不能用简单的import语句导入。代码方面,importmyfile与importmy-file相同,这会引发异常。这样的文件更好地被描述为脚本,而可导入的文件是模块。