模块
一个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里添加 项目的根路径就可以任意的使用模块了
|