python中的模块、包、库

模块:

就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块

包:

在模块之上的概念,为了方便管理而将文件进行打包。

一个文件夹下必须要有_init_.py这个文件才会被识别为包。
包目录下第一个文件便是 init.py,然后是一些模块文件和子目录
假如子目录中也有 init.py,那么它就是这个包的子包了

常见的包结构:

package_a
├── __init__.py
├── module_a1.py
└── module_a2.py

库:

具有相关功能模块的集合。
这也是Python的一大特色之一,即具有强大的标准库、第三方库以及自定义模块。
  • 标准库:就是下载安装的python里那些自带的模块,要注意的是,里面有一些模块是看不到的比如像sys模块,这与linux下的cd命令看不到是一样的情况
  • 第三方库:就是由其他的第三方机构,发布的具有特定功能的模块
  • 自定义模块:用户自己可以自行编写模块,然后使用

另外:模块、包、库这三个概念实际上都是模块,只不过是个体和集合的区别


Python中的import

当一个目录下有_init_.py文件时,该目录就是一个python的包

直接import安装的包

import Module
import Module as xx

从包import对象(下级模块,类,函数,变量等)

from Module import Name
from Module import xx as hostname
from Module import *

import包和import单个文件是一样的,我们可以这样类比:

import单个文件时,文件里的类,函数,变量都可以作为import的对象
import包时,包里的子包,文件,以及_init_.py里的类,函数,变量都可以作为import的对象

假设有如下目录结构
pkg
├── init.py
└── file.py

其中init.py内容如下

argument = 0
class A:pass

在和pkg同级目录下执行如下语句都是OK的

import pkg
 import pkg.file
 from pkg import file
 from pkg import A
 from pkg import argument

但如下语句是错误的

import pkg.A
 import pkg.argument

报错ImportError: No module named xxx,因为当我们执行import A.B,A和B都必须是模块(文件或包)

引用主程序所在库中的模块

Python引用当前库中的模块关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:
(1)主程序与模块程序在同一目录下:
如下面程序结构:

– src
|– mod1.py
`– test1.py

若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *;

(2)主程序所在目录是模块所在目录的父(或祖辈)目录
如下面程序结构:
-- src
|-- mod1.py
|-- mod2
|
– mod2.py
`– test1.py
若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件_init_.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.

(3)主程序导入上层目录中模块或其他目录(平级)下的模块
如下面程序结构:
-- src
|-- mod1.py
|-- mod2
|
– mod2.py
|– sub
| -- test2.py
– test1.py
若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立init.py文件(同(2)),src下不必建立该文件。然后调用方式如下:
下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行Python test2.py
而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。
import sys
sys.path.append(“..”)
import mod1
import mod2.mod2

(4)从(3)可以看出,导入模块关键是能够根据sys.path环境变量的值,找到具体模块的路径。这里仅介绍上面三种简单情况。

相对导入和绝对导入

绝对导入的格式为import A.B或from A import B
相对导入格式为from . import B或from ..A import B
.代表当前模块,..代表上层模块,…代表上上层模块,依次类推。当我们有多个包时,就可能有需求从一个包import另一个包的内容,这就会产生绝对导入,而这也往往是最容易发生错误的时候

导入模块时的一些规则

在没有明确指定包结构的情况下,python是根据name来决定一个模块在包中的结构的,如果是main则它本身是顶层模块,没有包结构,如果是A.B.C结构,那么顶层模块是A。

基本上遵循这样的原则

如果是绝对导入,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块