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


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

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

import my_module

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

from my_package.timing.danger.internets import function_of_love

任何Python文件都是一个模块,它的名称是文件的基本名称而没有.py扩展名。甲包是Python模块的集合:而一个模块是一个Python文件,一个包是含有一个额外的Python模块的目录__init__.py文件中,一个包从恰好包含一堆Python脚本的一个目录区分开。如果相应的目录包含自己的__init__.py文件,则包可以嵌套到任何深度。

模块和包之间的区别似乎只适用于文件系统级别。导入模块或包时,Python创建的相应对象始终是类型module。但是,请注意,导入包时,只能__init__.py直接看到该包文件中的变量/函数/类,而不是子包或模块。例如,考虑xmlPython标准库中的包:其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语言编写,但我认为你不打算考虑问题中的那些。