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
文件中的变量/函数/类,而不是子包或模块。 例如,考虑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
,这将引发异常。 这些文件可以更好地表征为脚本,而可导入的文件则是模块。
上一篇: What's the difference between a Python module and a Python package?