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创build的相应的对象总是具有types的module
。 但是,请注意,导入包时,只能直接看到该包的__init__.py
文件中的variables/函数/类, 而不是子包或模块。 例如,考虑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编写,但我不认为你的意思是考虑那些在你的问题。
从Python文档( 这里 ):
记住所有包是模块是很重要的,但并不是所有的模块都是包。 换句话说,软件包只是一种特殊的模块。 具体而言,包含
__path__
属性的任何模块都被视为一个包。
包的术语定义见这里 。
名称中带短划线的Python文件(如my-file.py
)不能使用简单的import
语句import
。 代码方面, import my-file
是相同的import my - file
,这将引发exception。 这样的文件更好地表征为脚本,而可导入的文件是模块 。
迟到的答案还有一个定义:
A package is represented by an imported top-entity which could either be a self-contained module, or the '__init__.py' special module as the top-entity from a set of modules within a sub directory structure.
所以物理上一个包是一个分配单元,它提供一个或多个模块。
所以,你回想起你的教科书上内容页面上章节分为几个单元的地方。 所以说不同的章节有不同的概念,它们有着相同的目标,或者是同一个理论的部分,然后把这些部分聚合在一起,形成模块。 同样,在编程中,当不同的function聚集在一起时,它们被分离并命名为模块。