python模块和python包有什么区别?
另请参见:"package"和"module"(其他语言)之间的区别是什么?
我可能错了,但对我来说:模块基本上是一个python文件。包是一个文件夹,其中包含一组模块(python文件)。
要被视为包,该文件夹必须包含一个__init__.py文件。
@LC2817:这是最常见的情况,但不需要从文件系统加载模块,例如,参见from plumbum.cmd import ls实现。
@Giuliopincastelli:在python 3.3+中,命名空间包不使用__init__.py。
社区如何区分python包和用于分发pypi/wheels/etc等python组件的包?这两个词对我来说似乎是"包裹"这个词的不同应用。
任何python文件都是一个模块,其名称是没有.py扩展名的文件的基名称。包是python模块的集合:当模块是单个python文件时,包是包含额外__init__.py文件的python模块的目录,用于区分包与刚好包含一组python脚本的目录。包可以嵌套到任何深度,前提是相应的目录包含自己的__init__.py文件。
模块和包之间的区别似乎仅限于文件系统级别。导入模块或包时,python创建的相应对象始终为module类型。但是,请注意,导入包时,只有该包的__init__.py文件中的变量/函数/类是直接可见的,而不是子包或模块。例如,考虑python标准库中的xml包:它的xml目录包含一个__init__.py文件和四个子目录;子目录etree包含一个__init__.py文件,以及一个ElementTree.py文件。查看当您尝试以交互方式导入包/模块时会发生什么:
>>> import xml
>>> type(xml)
>>> xml.etree.ElementTree
Traceback (most recent call last):
File"", line 1, in
AttributeError: 'module' object has no attribute 'etree'
>>> import x