Python中模块和库有什么区别?

128
我具有Java背景,并且刚接触Python。在继续之前,我希望确保我正确理解Python术语。
对于模块,我的理解是:它是一个脚本,可以被许多脚本导入,以使阅读更加容易。就像在Java中你有一个类,并且该类可以被许多其他类导入一样。
对于,我的理解是:一个库包含许多根据用途分隔的模块
我的问题是:库是否像软件包一样,例如您有一个名为food的软件包,然后:
  • chocolate.py
  • sweets.py
  • biscuts.py
这些都包含在food包中吗?
还是说库使用软件包,因此如果我们有另一个软件包drink
  • milk.py
  • juice.py
library将包含两个软件包?
此外,应用程序编程接口(API)通常包含一组库,这是在层次结构的顶部吗?
  1. API
  2. Library
  3. Package
  4. Module
  5. Script
因此,API将由2-5全部组成?

4
Python 使用术语“包”而不是“库”(除了标准库)。 - John Zwinck
这是一篇很好的文章,解释了Python中模块、包、库和框架的概念:https://learnpython.com/blog/python-modules-packages-libraries-frameworks/ - Dr Nisha Arora
4个回答

111

来自 Python教程 - 模块

  • 模块:

    模块是包含Python定义和语句的文件。文件名是模块名称加上后缀 .py

  • :

    包是使用“点模块名称”来结构化Python模块命名空间的一种方式。

如果你阅读import语句的文档,会得到更多细节,例如:

Python只有一种类型的模块对象,所有模块都是这种类型,无论模块是用Python、C还是其他语言实现的。为了帮助组织模块并提供命名层次结构,Python引入了包的概念。可以将包看作文件系统上的目录,将模块视为目录中的文件,但不要过于字面理解此比喻,因为包和模块不一定源自文件系统。在本文档中,我们将使用这个方便的目录和文件比喻。与文件系统目录类似,包是按层次结构组织的,包本身可能包含子包以及常规模块。需要牢记的是,所有包都是模块,但不是所有模块都是包。或者换句话说,包只是一种特殊类型的模块。具体来说,任何包含__path__属性的模块都被认为是包。
因此,术语module指的是一个特定的实体:它是一个类,其实例是您在Python程序中使用的module对象。通过类比,它还用于指代文件系统中创建这些实例的文件。
术语script用于指代旨在执行的模块。它与"程序"或"应用程序"具有相同的含义,但通常用于描述简单且规模较小的程序(即最多只有几百行代码的单个文件)。编写脚本需要几分钟或几个小时。
术语library仅是一个通用术语,用于指代旨在被多个应用程序使用的一堆代码。它提供一些通用功能,可以被特定应用程序使用。
当模块/包/其他东西被"发布"时,人们经常将其称为库。通常,库包含一个或多个相关包,但甚至可以是单个模块。
库通常不提供任何特定功能,即您无法"运行库"。
API的含义取决于上下文的不同。例如:
  • 它可以定义像DB APIbuffer protocol这样的协议。
  • 它可以定义如何与应用程序交互(例如Python/C API)。
  • 当涉及到库/包时,它仅是该库提供功能的接口(一组函数/类/常量等)。

无论如何,API都不是Python代码。它是一个可能更或少正式的描述。


48

只有 包(package)模块(module) 是 Python 中具有明确定义含义的术语。

  1. API 不是一组代码 - 它更像是一个“协议”规范,用于说明各个部分(通常是库)如何相互通信。Python 中有一些著名的“标准”API,例如 DB API

  2. 在我看来,库(library) 指除了 应用程序(application) 之外的任何东西 - 在 Python 中,库就是一个 模块(module) - 通常带有 子模块(submodules)。库的范围非常可变 - 例如,Python 标准库非常庞大(带有相当多的子模块),而 PyPi 中有很多单一目的的库,例如针对 py < 2.7 的 collections.OrderedDict 的后端(backport)

  3. 包(package) 是一个共享命名空间的 Python 模块集合。在实践中,可以通过将多个 Python 模块放置在带有特殊的 __init__.py 模块(文件)的目录中来创建它们。

  4. 模块是指单个的Python代码文件,旨在被导入。这有点简化了实际情况,因为在实践中,相当多的模块会检测到它们作为脚本运行时,并在这种情况下执行特殊操作。

  5. 脚本是指单个的Python代码文件,旨在作为“主”程序进行执行

  6. 如果您有一组跨越多个文件的代码,则可能拥有一个应用程序而非脚本。


1
那么在 matplotlib.pyplot 中,* matplotlib * 是包,* pyplot * 是模块,对吗?@Kimvais - Shub
@Shub 是的 - Kimvais

6
库:它是一组模块的集合。(库可以包含内置模块(用C语言编写)+用Python编写的模块)。 模块:一组标准化的部件或独立单元,可用于构建更复杂的结构。
通俗易懂地说,模块是一组用于特定目的的代码行,可以直接在其他程序中使用,以避免团队中出现DRY(不要重复自己),并专注于主要需求。 来源 API是其他应用程序与您的库进行交互的接口,而无需直接访问。 软件包基本上是一个带有文件的目录。 脚本是指单个文件内的一系列命令。

https://dev59.com/Lm855IYBdhLWcg3w3Ifs#4100483 比喻 - Premraj

1
I will try to answer this without using terms the earliest of beginners would use, and explain why or how they used differently, along with the most "official" and/or most understood or uniform use of the terms.
It can be confusing, and I confused myself thinking too hard, so don't think too much about it. Anyways context matters, greatly.
Library - Most often will refer to the general library or another collection created with a similar format and use. The General Library is the sum of 'standard', popular and widely used Modules, which can be thought of as single file tools, for now or shortcuts making things possible or faster. The general library is an option most people enable when installing Python. Because it has this name "Python General Library" it is used often with similar structure and ideas. Which is simply to have a bunch of Modules, maybe even packages grouped together, usually in a list. The list is usually to download them. Generally, it is just related files, with similar interests. That is the easiest way to describe it. 模块 - 模块指的是一个文件。该文件包含脚本,并且文件名就是模块的名称,Python文件以.py结尾。文件中只包含一些代码,这些代码运行在一起可以实现某些功能,通过使用函数、字符串等。 你可能经常看到的主要模块很受欢迎,因为它们是特殊的模块,可以从其他文件/模块获取信息。 这很令人困惑,因为文件名和模块名相同,只需去掉.py即可。实际上,它只是由某人编写的可用作快捷方式的代码,使某些事情更容易或可能发生。 - 这是一个术语,有时用于一般性描述,但上下文很重要。从我的经验来看,最常见的用法是将多个模块(或文件)分组在一起。它们被分组在一起的原因可能有几个,这就是上下文的作用。
以下是我注意到的包(们)术语的使用方式。它们是一组下载、创建和/或存储的模块。这些都可能是真实的,也可能只有其中之一,但实际上它只是引用其他文件的文件,需要以正确的结构或格式存在,而整个总和就是该软件包本身,已安装或可能已包含在Python通用库中。一个包可以包含模块(.py文件),因为它们彼此依赖,有时可能无法正常工作。每个部分(模块/文件)的共同目标始终存在,并且所有部分的总和就是该软件包本身。
在Python中,大多数情况下,包是模块,因为包名是用于连接所有部分的模块名称。因此,您可以输入一个包,因为它是一个模块,还允许它调用其他模块,这些模块不是包,因为它们仅执行特定功能或任务,不涉及其他文件。包有一个目标,每个模块一起努力实现最终目标。

大多数混淆源于文件名或前缀作为模块名再次用作包名。

请记住,模块和包可以安装。库通常是一个通用术语,用于列出或格式化一组模块和包。就像Python的通用库一样。层次结构不起作用,API实际上不属于任何特定位置,如果是的话,它们可以涉及脚本、模块和包中的任何地方,世界图书馆是如此通用的词,可以轻松应用于许多事物,也使得API能够在其上方或下方。有些模块可以基于其他代码,这是我认为它与纯Python相关的讨论唯一相关的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接