Python模块和Python包之间有什么区别?
另请参阅:“包”和“模块”之间的区别(对于其他语言)
Python模块和Python包之间有什么区别?
另请参阅:“包”和“模块”之间的区别(对于其他语言)
当前回答
模块:模块是一个简单的Python文件,扩展名为(.py),包含函数和全局变量的集合。它是一个可执行文件,Python中的Package概念用于排列所有模块。
例如:将代码保存在名为demo(module.py)的文件中。
def myModule1(name):
print("My Module name is: "+ name)
导入演示模块模块并在其中使用myModule1函数。
import demo_module
demo_module.myModule1("Math")
解决方案:
我的模块名称是:数学
包:包是包含模块集合的基本目录。该目录包含Python模块以及一个(__init.py__)文件,解释器使用该文件将其识别为包。该包只不过是一个命名空间。在包中,有子包。
例如:
学生(套餐)
|__init__.py(构造函数)
|details.py(模块)
|marks.py(模块)
|collegeDetails.py(模块)
|demo_module.py(模块)
包是一组组织成目录以形成包目录的模块。
from Student import details, collegeDetails, demo_module
其他回答
迟来的答案,还有另一个定义:
包由导入的顶级实体表示,该顶级实体可以是一个独立模块,或__init__.py特殊模块作为子目录结构中的一组模块中的顶级实体。
因此,包实际上是一个分发单元,它提供一个或多个模块。
从Python词汇表中:
重要的是要记住,所有包都是模块,但并非所有模块都是包。换句话说,包只是一种特殊的模块。具体来说,任何包含__path__属性的模块都被视为包。
名称中带有破折号的Python文件(如my-file.py)不能用简单的import语句导入。代码方面,importmyfile与importmy-file相同,这会引发异常。这样的文件更好地被描述为脚本,而可导入的文件是模块。
我读了这个问题的不同答案。这一问题已得到充分解决。但在我看来,多强调一点可能不是一个坏主意。如果我们检查不同模块的__package__值,我们会得到以下结果。所有这些都是模块类型,但其中一些没有定义包。检查__package__的“随机”和“数学”。
import cv2
import math
import random
import tkinter as tk
print('cv2:',type(cv2)) # <class 'module'>
print('cv2:',cv2) # <module 'cv2.cv2' from 'PATH'>
print('cv2:',cv2.__package__) # cv2
print('random:',type(random)) # <class 'module'>
print('random:',random) # <module 'random' from 'PATH'>
print('random:',random.__package__) # [EMPTY]
print('tk:',type(tk)) # <class 'module'>
print('tk:',tk) # <module 'tkinter' from 'PATH'>
print('tk:',tk.__package__) # tkinter
print('math:',type(math)) # <class 'module'>
print('math:',math) # <module 'math' (built-in)>
print('math:',math.__package__) # [EMPTY]
因此,如果我们按如下方式定义文件夹:
这是我们如何看到__package__输出的:
import myfolder
import myfolder.script1 as s1
import myfolder.script2 as s2
import myfolder.mySubfolder.script3 as s3
print(type(s1)) # <class 'module'>
print(type(s2)) # <class 'module'>
print(type(s3)) # <class 'module'>
print(s1.__package__) # myfolder
print(s2.__package__) # myfolder
print(s3.__package__) # myfolder.mySubfolder
print(myfolder) # <module 'myfolder' (namespace)>
print(myfolder.mySubfolder) # <module 'myfolder.mySubfolder' (namespace)>
print(myfolder.mySubfolder.script3) # <module 'myfolder.mySubfolder.script3' from 'PATH'>
print(myfolder.__package__) # myfolder
print(myfolder.mySubfolder.__package__) # myfolder.mySubfolder
print(myfolder.mySubfolder.script3.__package__) # myfolder.mySubfolder
模块:模块是一个简单的Python文件,扩展名为(.py),包含函数和全局变量的集合。它是一个可执行文件,Python中的Package概念用于排列所有模块。
例如:将代码保存在名为demo(module.py)的文件中。
def myModule1(name):
print("My Module name is: "+ name)
导入演示模块模块并在其中使用myModule1函数。
import demo_module
demo_module.myModule1("Math")
解决方案:
我的模块名称是:数学
包:包是包含模块集合的基本目录。该目录包含Python模块以及一个(__init.py__)文件,解释器使用该文件将其识别为包。该包只不过是一个命名空间。在包中,有子包。
例如:
学生(套餐)
|__init__.py(构造函数)
|details.py(模块)
|marks.py(模块)
|collegeDetails.py(模块)
|demo_module.py(模块)
包是一组组织成目录以形成包目录的模块。
from Student import details, collegeDetails, demo_module
任何Python文件都是一个模块,其名称是文件的基本名称,不带.py扩展名。包是Python模块的集合:虽然模块是单个Python文件,但包是包含额外__init__.py文件的Python模块目录,以区分包和恰好包含一堆Python脚本的目录。只要相应的目录包含自己的__init__.py文件,包可以嵌套到任何深度。
模块和包之间的区别似乎只在文件系统级别上存在。当您导入模块或包时,Python创建的相应对象总是模块类型。但是,请注意,当您导入包时,只有该包的__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编写的,但我不认为您打算在问题中考虑这些模块。