模块概述
模块(module):一个扩展名为 .py 的文件,一个模块可以包含很多个函数。使用模块,不仅可以避免函数名和变量名的冲突,而且提高了代码的可维护性和重用性。
自定义模块
自定义模块有两个作用:
- 规范代码,让代码更易于阅读
- 便于其他程序调用
创建模块
创建模块是指将模块相关代码编写至一个以 module_name.py 形式命名的单独文件,其中创建模块名时注意模块名不是与Python自带的模块重名。
模块的扩展名必须为
.py
导入模块
导入模块存在两种方式:
- 使用
import语句导入模块 - 使用
from ... import ...语句导入模块
调用代码可以使用 import 语句实现,使用 import 语句还可以一次导入多个模块,模块名之间使用逗号间隔。其语法格式如下所示:
import module_name1 [[as other_name], module_name2 ...]
module_name:指定需要导入的模块名称as other_name:为导入的模块起一个别名,通过别名调用函数
在调用模块中的变量、函数或者类时,需要在变量名、函数名或类名前添加
模块名.作为前缀,但是当使用as 别名时,此时的模块名.前缀需要更改为别名.的形式。
若不想在每次导入模块时都创建一个新的命名空间,而是仅将具体的定义导入当前的命名空间中,这时可以使用 form ... import 语句。当使用该语句导入后,不需要再添加前缀,可以直接通过具体的变量、函数和类名等访问即可。其语法结构如下:
from module_name as member
module_name:模块名称,区分大小写member:指定需要导入的变量、函数或者类,若要导入全部定义,可以使用通配符*
使用通配符
*导入全部定义后,想查看具体导入了那些定义们可以通过显示dir()函数的值来查看。
例如,执行print(dir())语句,将显示以下定义:
from requests import api, exceptions,auth
print(dir())
'''
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'api', 'auth', 'exceptions']
'''
在使用 from ... import 语句导入模块中的定义时,需要保证所导入的内容在当前的命名空间中是唯一的,否则将出现冲突,后导入的同名变量、函数或者类会覆盖先导入的。此时需要使用 import 语句导入。
模块搜索目录
使用 import 语句导入模块时,注意文件所在的位置目标,默认情况下,会按照以下顺序进行查询:
- 在当前目录(即执行的Python脚本文件所在目录)中进行查找
- 在PYTHONPATH(环境变量)下的每个目录中进行查找
- 在Python的默认安装目录中进行查找
以上各个目录的具体位置保存标准模块 sys 的 sys.path 变量中,可以通过下述代码查询代码:
import sys
print(sys.path)
三种将指定目录添加到 sys.path 的方式
1. 临时添加
临时添加表示在导入模块的Python文件中进行添加。例如要将 D:/program/python/code 目录添加到 sys.path 中,可以使用如下代码:
import sys
sys.path.addend('D:/program/python/code')
通过该方法添加的目录只在执行当前文件的窗口中有效,窗口关闭后即失效。
2. 增加 .pth 文件
在Python安装目录下的 Lib\site-packages 子目录中,创建一个扩展名为 .pth 的文件,文件名任意,在该文件中添加需要导入模块所在的目录,例如要将 D:/program/python/code 目录导入 .pth 文件,则只需在该文件中添加目录:
D:/program/python/code
创建
.pth文件后,需要重新打开要执行的导入模块的Python文件,否则新添加的目录不起作用,该方法添加的目录只在当前版本的Python中有效。
3. 在PYTHONPATH环境变量中添加
在电脑上找到 环境变量 进入,若在环境变量的列表中未发现 PYTHONPATH ,则需要自己创建一个,否则可以直接打开该变量,在编辑该变量的变量值,目录之间使用 ; 间隔。如下所示:

在环境变量中添加模块目录后,需要重新打开要执行的导入模块的Python文件,否则新添加的目录不起作用,该方法可以同时适用于多个Python版本。
Python中的包
包(package):包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下,这样既可以起到规范代码的作用,又能避免模块名重名引起的冲突。
包简单理解为文件夹,只不过在该文件夹下必须存在一个名称为
__init__.py的文件
Python程序的包结构
在实际项目开发中,通常情况下会创建多个包用于存储不同类的文件。例如在开发一个网站时,可以创建如下所示包结构:
项目名shop
│
├── admin(用于保存后台文件的包)
│ |
| └──—__init__.py forms.py views.py
|
└── home(用于保存前台文件的包)
| │
| └── __init__.py forms.py views.py
|
└── templates(用于保存模板文件的包)
│
└── __init__.py
│
└──models.py
|
|
manage.py(入口程序)
创建和使用包
创建包只需两步,首先新建文件夹,然后在该文件夹中创建一个名称为 __init__.py 的文件即可。在 __init__.py 文件中可以不编写任何代码,在该文件夹的程序在导包时会自动执行。
__init__.py文件是一个模块文件,模块名为对应的包名
创建包后,就可以在包中创建相应的模块了。然后使用import语句从包中加载模块。通常由三种方式可以从包中加载模块,例如需要调用info包中demo模块下的变量say,则调用say的方式如下:
通过 import 完整包名.完整模块名 的方式加载指定的模块,调用时必须添加前缀(即完整包名.模块名 )
import info.demo
print(info.demo.say)
通过 from 完整包名 import 模块名 的形式加载指定模块。调用时只需加模块名前缀(即 import 后面的内容)
from info import demo
print(demo.say)
通过 from 完整包名.模块名 import 定义名 的形式加载指定的模块。可直接调用函数,可导入多个定义名,定义名与定义名之间以 , 间隔
from info.dmeo import sys
print(say)
在通过
from 包名.模块名 import 定义名的形式加载指定模块时,可以使用*代替定义名,表示加载该模块中的不以下划线_开头的定义。
以主程序的形式执行
在每个模块的定义中都包括一个记录模块名称的变量 __name__,程序可以检查该变量,以确定它们在哪个模块中被执行。如果一个模块不是被导入其他程序中执行,那么它们可能在解释器的顶级模块中被执行。顶级模块的__name__ 变量的值为 __main__,如下示例:
定义一个需要被调用的模块info:
def func():
print("hello world!")
print("接下来调试一下代码")
func()
当我在其他程序中调用此模块时,发现与预期不符:
import info
print("调用模块函数:",info.func())
"""
执行结果为:
接下来调试一下代码
hello world!
调用模块函数:hello world!
"""
这是我们只需修改模块代码,将其设置为以主程序形式执行即可,修改如下:
def func():
print("hello world!")
if __name__ == '__main__':
print("接下来调试一下代码")
func()
引用其他模块
Python安装路径下的Doc目录内的html文件夹是对Python的使用帮助文档。 Python第三方模块官网 点击访问
安装和卸载第三方模块的命令:
pip install 模块名[=版本] # 安装
pip uninstall 模块名[=版本] # 卸载
pip list # 查看已安装列表
模块导入时的顺序推荐:
- 导入Python提供的标准模块
- 导入第三方模块
- 导入自定义模块