Python/模块与包之包
1. 包是一种通过使用模块名 来组织Python模块名称空间的方式,一个类似于目录并存有__init__.py文件的被称为包
包的本质就是一个包含__init__.py文件的目录。
包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
包
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。
可以从包中导入单独的模块。
1). import PackageA.SubPackageA.ModuleA,使用时必须用全路径名
2). 变种: from PackageA.SubPackageA import ModuleA, 可以直接使用模块名而不用加上包前缀。
3). 也可以直接导入模块中的函数或变量:from PackageA.SubPackageA.ModuleA import functionA
import语句语法:
1. 当使用from package import item时,item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)
首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。
2. 当使用import item.subitem.subsubitem语法时,最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量
3. from pacakge import *
如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。
如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
python包是:
包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。
常见问题:
- 引入某一特定路径下的模块
- 使用
sys.path.append(yourmodulepath)
- 使用
- 将一个路径加入到python系统路径下,避免每次通过代码指定路径
- 利用系统环境变量
export PYTHONPATH=$PYTHONPATH:yourmodulepath
, - 直接将这个路径链接到类似
/Library/Python/2.7/site-packages
目录下
- 利用系统环境变量
- 好的建议
- 经常使用
if __name__ == ‘__main__‘
,保证你写包既可以import又可以独立运行,用于test。 - 多次import不会多次执行模块,只会执行一次。可以使用
reload
来强制运行模块,但不提倡。
- 经常使用
包(package)
为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py
文件。常见的包结构如下:
package_a ├── __init__.py ├── module_a1.py └── module_a2.py package_b ├── __init__.py ├── module_b1.py └── module_b2.py main.py
- 如果
main.py
想要引用packagea
中的模块module
a1
,可以使用:
from package_a import module_a1 import package_a.module_a1
- 如果
packagea
中的module
a1
需要引用packageb
,那么默认情况下,python是找不到package
b
。我们可以使用sys.path.append(‘../‘)
,可以在packagea
中的__init__.py
添加这句话,然后该包下得所有module都添加*import __init
_
即可。