Python模块和Python包之间有什么区别?

另请参阅:“包”和“模块”之间的区别(对于其他语言)


当前回答

任何Python文件都是一个模块,其名称是文件的基本名称,不带.py扩展名。包是Python模块的集合:虽然模块是单个Python文件,但包是包含额外__init__.py文件的Python模块目录,以区分包和恰好包含一堆Python脚本的目录。只要相应的目录包含自己的__init__.py文件,包可以嵌套到任何深度。

模块和包之间的区别似乎只在文件系统级别上存在。当您导入模块或包时,Python创建的相应对象总是模块类型。但是,请注意,当您导入包时,只有该包的__init__.py文件中的变量/函数/类是直接可见的,而不是子包或模块。例如,考虑Python标准库中的xml包:其xml目录包含__init__.py文件和四个子目录;子目录etree包含__init__.py文件,以及ElementTree.py文件。查看尝试以交互方式导入包/模块时发生的情况:

>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>

在Python中,也有内置模块,如sys,它们是用C编写的,但我不认为您打算在问题中考虑这些模块。

其他回答

迟来的答案,还有另一个定义:

包由导入的顶级实体表示,该顶级实体可以是一个独立模块,或__init__.py特殊模块作为子目录结构中的一组模块中的顶级实体。

因此,包实际上是一个分发单元,它提供一个或多个模块。

我知道,现在太晚了,但对一些人来说,一个简单的答案就足够了:

模块是文件,

包是一个文件夹。

从Python词汇表中:

重要的是要记住,所有包都是模块,但并非所有模块都是包。换句话说,包只是一种特殊的模块。具体来说,任何包含__path__属性的模块都被视为包。

名称中带有破折号的Python文件(如my-file.py)不能用简单的import语句导入。代码方面,importmyfile与importmy-file相同,这会引发异常。这样的文件更好地被描述为脚本,而可导入的文件是模块。

任何Python文件都是一个模块,其名称是文件的基本名称,不带.py扩展名。包是Python模块的集合:虽然模块是单个Python文件,但包是包含额外__init__.py文件的Python模块目录,以区分包和恰好包含一堆Python脚本的目录。只要相应的目录包含自己的__init__.py文件,包可以嵌套到任何深度。

模块和包之间的区别似乎只在文件系统级别上存在。当您导入模块或包时,Python创建的相应对象总是模块类型。但是,请注意,当您导入包时,只有该包的__init__.py文件中的变量/函数/类是直接可见的,而不是子包或模块。例如,考虑Python标准库中的xml包:其xml目录包含__init__.py文件和四个子目录;子目录etree包含__init__.py文件,以及ElementTree.py文件。查看尝试以交互方式导入包/模块时发生的情况:

>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>

在Python中,也有内置模块,如sys,它们是用C编写的,但我不认为您打算在问题中考虑这些模块。

模块是在一次导入下导入并使用的单个文件。例如

import my_module

包是提供包层次结构的目录中的模块集合。

from my_package.timing.danger.internets import function_of_love

模块文档

软件包简介