导入包
[ ]表示optional
module(模块)其实就是一个.py文件,包含了 Python 对象定义和Python语句。
package(包)是一系列的有关文件的集合,由模块或子包组成。
所有包含的包都被记录在sys.modules中
print(sys.modules)
绝对导入和相对导入
- 绝对导入的格式为
import A.B
或from A import B
- 相对导入格式为
from . import B
或from ..A import B
存在相对导入语句的模块,不能直接运行,否则会有异常。
也就是说如果在顶层模块main.py中用from . import B
就会报错ValueError: Attempted relative import in non-package
。
只能在包中使用相对导入,因为包就是要被层层地包含到顶层模块运行的,而不需要作为顶层模块运行。
在没有明确指定包结构的情况下,Python 是根据__name__ 来决定一个模块在包中的结构的,如果是 __name__ 则它本身是顶层模块,没有包结构,如果是A.B.C 结构,那么顶层模块是 A。基本上遵循这样的原则:
- 如果是绝对导入,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块
- 如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块
在如上图结构中,module3中能相对导入(具有包结构)只能包含顶层包test1内的模块和子包如(m1,m2,test2.m3)。如from .. import module1
。但是可以绝对导入其顶层模块同级别的模块及其子模块如import test3.module4
- import
包.子包.模块[.对象或函数)]
[as别名
]: 使用的时候需要用别名.
或模块.子模块.
前缀 - from
绝对/相对导入+包.子包+.模块
import对象、函数或变量
from绝对/相对导入+包.子包
import模块
使用的时候不需要前缀,可能引起同名冲突。
dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
- 当前目录
- 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
- 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
Python中的包
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空。init.py 用于标识当前文件夹是一个包。
考虑一个在 package_runoob 目录下的 runoob1.py、runoob2.py、init.py 文件,test.py 为测试调用包的代码,目录结构如下:
test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py
常用的库
from math import pi