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

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

#1楼

重要的是要记住所有包都是模块,但并非所有模块都是包。 换句话说,包只是一种特殊的模块。 具体来说,任何包含__path__属性的模块都被视为包。

名称中包含短划线的Python文件(如my-file.py )无法使用简单的import语句import 。 代码明智的, import my-file是相同的import my - file ,这将引发异常。 这些文件更好地表征为脚本,而可导入文件是模块 。

#2楼

一个迟到的答案,另一个定义:

包由引入的顶层实体表示,该顶层实体可以是自包含模块,也可以是__init__.py特殊模块,作为子目录结构中一组模块的顶层实体。

所以物理上一个包是一个分发单元,它提供一个或多个模块。

#3楼

首先,请记住,在精确定义中, 模块是Python解释器内存中的对象,通常通过从磁盘读取一个或多个文件来创建。 虽然我们可以非正式地将磁盘文件(例如a/b/c.py称为“模块”,但它实际上并不会成为一个,直到它与来自其他几个源(例如sys.path )的信息组合才能创建模块对象。

(注意,例如,可以从同一个文件加载具有不同名称的两个模块,具体取决于sys.path和其他设置。这正是python -m my.module后面的import my.module发生的情况。解释;将有两个模块对象, __main__和my.module ,无论是从磁盘上,相同的文件创建my/module.py )。

包是一个可能有子模块(包括子包)的模块。 并非所有模块都能做到这一点。 例如,创建一个小模块层次结构:

$ mkdir -p a/b

$ touch a/b/c.py

确保a下没有其他文件。 启动Python 3.4或更高版本的解释器(例如,使用python3 -i )并检查以下语句的结果:

import a

a ⇒

a.b ⇒ AttributeError: module 'a' has no attribute 'b'

import a.b.c

a.b ⇒

a.b.c ⇒

模块a和ab是包(事实上,某种类型的包被称为“命名空间包”,虽然我们不会在此担心)。 但是,模块abc不是包。 我们可以通过在上面的目录结构中添加另一个文件a/b.py并启动一个新的解释器来证明这一点:

import a.b.c

⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package

import a.b

a ⇒

a.__path__ ⇒ _NamespacePath(['/.../a'])

a.b ⇒

a.b.__path__ ⇒ AttributeError: 'module' object has no attribute '__path__'

Python确保在加载子模块之前加载所有父模块。 在它上面发现a/是一个目录,因此创建了一个命名空间包a ,并且a/b.py是一个Python源文件,它加载并用于创建(非包)模块ab 。 此时你不能拥有一个模块abc因为ab不是一个包,因此不能有子模块。

您还可以在此处看到包模块a具有__path__属性(包必须具有此属性),但非包模块ab不具有此属性。

#4楼

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

import my_module

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

from my_package.timing.danger.internets import function_of_love

#5楼

任何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 xml.etree

>>> type(xml.etree)

>>> xml.etree.ElementTree

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'ElementTree'

>>> import xml.etree.ElementTree

>>> type(xml.etree.ElementTree)

>>> xml.etree.ElementTree.parse

在Python中也有内置的模块,比如sys ,用C语言编写,但我认为你不打算考虑那些问题。