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

新手上路,请多包涵
阅读 310
2 个回答

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

import my_module

包是目录中模块的集合,它们给出了包层次结构。

 from my_package.timing.danger.internets import function_of_love

模块文档

包介绍

原文由 Jakob Bowyer 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

模块和包之间的区别似乎只存在于文件系统级别。当您导入模块或包时,Python 创建的相应对象始终是类型 module 。但是请注意,当您导入一个包时,只有该包的 __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 语言编写的,但我认为您不打算考虑问题中的那些。

原文由 Giulio Piancastelli 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题