模块和包
在计算机程序开发过程中,随着程序代码越来越多,在一个文件里的代码越来越多,越来越不容易维护
为了编写可以维护的代码,我们把很多模块分组,分别放在不同的文件里,这样每个文件里面包含的代码就相对的少
在Python中,每个.py就是一个模块(module)
优点
- 提高了代码的可维护性
- 每个模块都是可重用的
- 避免函数名和变量名冲突
模块分为三类
- 内置模块
- 第三方模块
- 自定义模块
导入模块
#导入xxx模块 import xxx #从xxx导入xx from xxx import xx #起别名x from xxx import xx as x #将xxx模块全部导入,调用时不需要xxx.了(不推荐使用) from xxx import *
安装第三方模块
pip install xxx
卸载第三方模块
pip uninstall xxx
默认会使用python官方服务器下载,速度比较慢,可以改用国内的源
(从豆瓣安装并将该网址信任)
pip install -i http://pypi.douban.com/simple xxx --trusted-host pypi.douban.com
包
当你的模块越来越多,就需要对模块进行划分,根据不同的功能分为多个目录,一个目录管理多个模块文件,这个目录称为包
包里面应该有一个__init__.py文件,用于告诉python解析器这是一个包,
示例
#文件路径 imports ---text ---__init__.py ---text1.py ---proj ---__init__.py ---proj1.py ---模块.py
在模块.py中导入text1.py文件
from text import text1
在text1.py中导入proj.py文件
import sys print(sys.path). #打印python的环境变量,第一个''是当前目录 sys.path.append('/Users/sunlizhao/PycharmProjects/imports') #将目录路径写入到环境变量中(当前文件有效) print(sys.path)
现在就可以在text1.py中导入proj.py文件了
from proj import proj1.py
但是这样就把路径给写死,如果项目更换平台就会报错
获取当前文件路径
print(__file__) #/Users/sunlizhao/PycharmProjects/imports/text/text1.py
但是我们只想获取到imports目录这一层
import sys,os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) print(BASE_DIR) #/Users/sunlizhao/PycharmProjects/imports
发现这样就向上了两层目录
然后将目录添加到环境变量
sys.path.append(BASE_DIR) print(sys.path)
这样在pycharm中成功了,但是在终端中很可能会失败,找了一下原因__file__还不是绝对路径
import sys,os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from proj import proj1
相对路径(路径关系比较严格,不常用)
相对路径往上翻不能到程序的目录,在这个例子中,就是不能到imports目录
这样就需要重新更改一下目录结构
imports ---tete ---text ---__init__.py ---text1.py ---proj ---__init__.py ---proj1.py ---模块.py
在text1.py中导入proj1.py文件
from ..proj import proj1