分发包 vs 导入包

“包”这个词通常指代许多不同的概念。本页面阐明了 Python 打包中两个不同但相关的含义:“分发包”和“导入包”之间的区别。

什么是分发包?

分发包是一个可以安装的软件。大多数情况下,这与“项目”是同义词。当你输入 pip install pkg,或者当你在 pyproject.toml 中写入 dependencies = ["pkg"] 时,pkg 是分发包的名称。当你搜索或浏览 PyPI(最广为人知的用于安装 Python 库和工具的集中式来源)时,你看到的是分发包列表。或者,“分发包”一词也可以指代包含项目某个特定版本的文件。

请注意,在 Linux 世界中,“分发包”(最常见的缩写是“distro package”或简称为“package”)是由 Linux 发行版的系统包管理器提供的东西,这是一个不同的含义。

什么是导入包?

导入包是一个 Python 模块。因此,当你在 Python 代码中写入 import pkgfrom pkg import func 时,pkg 是一个导入包的名称。更准确地说,导入包是特殊的 Python 模块,可以包含子模块。例如,numpy 包包含 numpy.linalgnumpy.fft 等模块。通常,导入包是文件系统上的一个目录,其中包含作为 .py 文件的模块和作为子目录的子包。

一旦安装了提供导入包的分发包,你就可以使用它了。

分发包名称和导入包名称如何比较?

导入包的名称应为有效的 Python 标识符(确切规则可在 Python 文档中找到)[1]。特别是,它们使用下划线 _ 作为单词分隔符,并且它们是区分大小写的。

另一方面,分发包可以使用连字符 - 或下划线 _。它们还可以包含点 .,有时用于打包 命名空间包 的子包。在大多数情况下,它们不区分大小写和 -_ 的差异,例如,pip install Awesome_Packagepip install awesome-package 相同(具体规则在名称规范化规范中给出)。