Py002_02_01模块和包

模块

一个python文件就是一个模块

随着程序代码越来越多,在一个文件里代码越来越多,越来越难以维护。于是就把代码进行拆分。每个功能进行独立。–模块的诞生

这样,每个文件包含的代码就变少了。维护成本就低了

是不是很像树的结构那样。如某个功能修改仅仅需要修改对应节点的代码。

模块的好处

  • 提高可维护性
  • 可重用
  • 避免函数名和变量名冲突

模块分类

  • 内置模块,执行help(‘modules’) 查看所有python自带模块
  • 第三方模块,通过pip install 的模块
  • 自定义模块

导入一个模块

1
2
3
4
import mod
from mod import xx
from mod.xx.xx import xx as yy
from mod.xx.xx import *

详情链接

通过sys可以查看模块的路径

1
2
3
4
5
import sys

print(sys.path) # 打印一个列表,列表代表导入模块的路径,会从左到右查找,默认先从当前目录找

如果全没找到就报错

sys.path里的目录我们只关心 site-packages目录这是所有的标准库和第三方库位置

开源模块使用

开源模块网址

下载文件(人肉安装)

1
2
3
4
5
1. 下载第三方包
2. 解压
3. 打开命令行输入 python setup.py build
会帮你创建一个build目录
4. python setup.py install 会提示你安装成功

命令行安装

1
2
3
4
5
# 安装
pip3 install 包名

# 卸载
pip3 uninstall 包名

pip安装的一个问题

1
2
3
由于网站是外国网站所以pip安装比较慢

于是类似于js的npm淘宝源的东西出现了,就是国内镜像

一些国内镜像源

1
2
3
4
5
6
pip3 install -i http://pypi.douban.com/simple/ 模块名

但是mac上会报安全问题

可以这样:
pip3 install -i http://pypi.douban.com/simple/ 模块名 --trusted-host pypi.douban.com

包 package

现有如下目录结构

  • 第一步
1
2
3
4
5
6
7
8
9
10
-|my_pro  根路径
---|mod1
------|a.py
------|b.py
------|c.py
---|mod2
------|d.py
------|e.py
------|f.py
---|index.py
  • 第二步
1
2
3
# a.py中有如下内容 
def sayHi():
print('hello')
  • 第三步
1
2
3
4
5
# index.py 中引入a.py功能

from mod1 import a

a.sayHi()
  • 以上在python3中能正常运行,但是在 python2 中会报错找不到这个模块
1
2
3
4
5
6
7
8
实际上 mod1 / mod2 虽然可以导入,但它并不是一个包

你需要这样:

在mod1、和mod2文件夹下分别创建 __init__.py文件(内容什么也没有)

这样在 python2 中就是一个包了
在 python3 中加不加都一样(默认帮你优化了)
  • 模块间相互使用嵌套特别多的时候
1
2
3
4
5
6
7
8
9
10
11
12
13
|——root
|——|——t1
|——|——|——__init__.py
|——|——|——aaa.py
|——|——|——t3
|——|——|——|——__init__.py
|——|——|——|——ccc.py
|——|——t2
|——|——|——__init__.py
|——|——|——bbb.py
|——|——|——t4
|——|——|——|——__init__.py
|——|——|——|——ddd.py

这样的目录结构需要把 root路径引入

1
2
3
4
5
6
7
8
9
如在 t1包下的 aaa为入口时就要 将根目录root加入到sys.path中 这样该目录下的所有包之间都可以引用了
import os ,sys
# os.path.dirname() 获取当前路径的目录名
# print(os.path.abspath(__file__)) # 获取当前目录绝对路径

# 获取根路径
baseDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 添加到sys.path 这个里面是个列表 就是调用方法或模块的查找路径
sys.path.append(baseDir)

结论:

1
2
1. 文件夹中必须有 __init__.py 文件,该文件可以为空,但必须存在
2. 在任意一个py文件里 往sys.path里添加 项目的根路径就可以任意的使用模块了