多年之前,海洋馆里,巨大的白鲸无声地从两人之间游过;多年之后,一个人古铜色的骨骸静静地躺在世界的彼端,另一个人在空无一人的房间里合衣躺下,世界喧闹而寂静,天空渐黑;相遇的美好,总让人误以为可以持续下去,直到十年百年千年后,其实全都错了。
模块:即你写的一个单纯的py文件,这个文件有一些功能函数或者变量。那么从另一个文件直接调用这个文件就是调用模块。
包:即一个完整的文件包,包括init.py,还有一些主要的提供功能的文件。文件结构更加复杂,针对的是提供大型API功能。
总结:包是由一系列模块组成的集合。模块是处理某一类问题的函数和类的集合。
注意:你写的模块或者包的文件名不要和系统或者Python内置的模块重名。
import的作用
- 找到模块
- 找到后第一次导入的时候会把该py文件编译成字节码
- 执行模块里面的内容
那么如何找到模块呢?
- 首先就像下面演示A.py,B.py一样,在同一个目录的话,可以直接导入
- 如果不在同一个目录的话,程序会在PYTHONPATH目录寻找你导入的模块名,如何查询PYTHONPATH中包含的目录呢?导入sys后打印sys.path即可。所以你可以在你的模块开头sys.path.append(‘..’)添加上部的路径到环境变量
- 还没有的话就会从标准库文件中寻找,即你的python安装包的lib目录,下面有个site-package目录
- 再没找到的话就会报错了
模块
两个文件在同一个目录下,文件A.py和文件B.py,其中A.py的内容如下:
a = '浪子66666666'
那么如何在B.py中调用模块A.py的内容呢?在B.py文件中这么写即可。
from A import a
print a
但是这种方法如果B.py中也有a这个变量的话,会冲突。
还可以直接导入A中的所有内容包括函数等等
import A
即可,调用A的变量时候需要这么用
print A.a
如果A中有函数同理。
模块也是对象,如果你在A.py文件的开头写了一大堆的注释,比如这样
# coding:utf-8
'''
浪子好帅啊
怎么会这么帅
啊啊啊啊
'''
a=123
在B.py文件中导入A后,打印A.__doc__的话,就可以把A中注释的真实内容打印出来。
包
前面说过,包是更加复杂的模块。import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的init.py,导入包本质就是在导入该文件。
注意:
- 关于包相关的导入语句也分为import和from … import …两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
- 对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
- 对比import item 和from item import name的应用场景:
如果我们想直接使用name那必须使用后者。
绝对导入和相对导入
最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以glance作为起始
相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)