模块概述

模块(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 语句导入模块时,注意文件所在的位置目标,默认情况下,会按照以下顺序进行查询:

  1. 在当前目录(即执行的Python脚本文件所在目录)中进行查找
  2. 在PYTHONPATH(环境变量)下的每个目录中进行查找
  3. 在Python的默认安装目录中进行查找

以上各个目录的具体位置保存标准模块 syssys.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 ,则需要自己创建一个,否则可以直接打开该变量,在编辑该变量的变量值,目录之间使用 ; 间隔。如下所示:

Pasted image 20250712145702

在环境变量中添加模块目录后,需要重新打开要执行的导入模块的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                     # 查看已安装列表

模块导入时的顺序推荐:

  1. 导入Python提供的标准模块
  2. 导入第三方模块
  3. 导入自定义模块