Python模块与包

学习地址

模块

模块是Python程序架构的一个核心概念

每一个以扩展名py结尾的Python源代码文件都是一个模块
模块名同样也是一个标识符,需要符合标识符的命名规则
在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块

导入

  1. import导入
    1
    2
    import 模块名1, 模块名2
    import 模块名3

在导入模块时,每个导入应该独占一行
通过模块名.就可以使用模块中的工具 – 全局变量、函数、类
使用as指定模块的别名,作为一种长模块名的缩写方便使用

1
import 模块名 as 模块别名

  1. from ... import ...导入

    • 希望从某一个模块中导入指定工具
    • import 模块名是一次性把模块中所有的工具全部导入,并且通过模块名/别名访问

    不需要通过模块名.使用工具了,直接使用即可

  2. from ... import *

    • 从模块中导入所有工具,也可以直接使用
    • 实际开发中不推荐使用,因为函数重命没有任何提示,出现问题难以排查

注意:

  • 如果两个模块,存在同名函数,从不同的模块中导入同名的函数时,后导入模块的函数会覆盖先导入的函数
  • 开发时,import 代码应该统一写在代码顶部,一旦发现冲突可以用as给其中一个函数起别名

模块搜索顺序

Python的解释器在导入模块时,会:

  1. 搜索当前目录指定模块名的文件,如果有就直接导入
  2. 如果没有,再搜索系统目录

在开发时,给文件起名不要和系统的模块文件重名

1
2
import 模块名
print(模块名.__file__) # 查看模块的路径

模块开发原则

原则
  • 每一个文件都应该是可以被导入的

一个独立的Python文件就是一个模块
在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍
直接执行的代码不是向外界提供的工具(全局变量,函数,类),这样只要import了这个模块,就会自动执行

实际开发中:

  • 每个模块都是独立开发的,开发人员通常会再模块下方增加一些测试代码if __name__==__main__
__name__属性
  • __name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入时,不被执行
  • __name__Python的一个内置属性,记录着一个字符串
  • 如果被其他文件导入的,__name__就是所属的模块的模块名
  • 如果是当前执行的程序,__name__main__
  • if __name__==__main__只会在当前执行的程序中有效,如果这条语句所属的文件被其他文件导入,__name__记录的是模块名,就无法执行了之后的代码了

包(package)

概念

  1. 包是一个包含多个模块特殊目录
  2. 目录下由一个特殊的文件__init__.py
  3. 包的命名方式和变量名一致

使用import 包名可以一次性导入包中所有的模块

__init__.py

在当前目录下新建目录Directory或者Python Package,前者需要手动创建__init__.py文件,后者则会自动创建空的__init__.py

如果在新建的目录也就是我们要用的包下新建了其他的模块,在导入包时想调用模块,table键却无法自动提示所含的模块,那么就需要对__init__.py文件进行修改了

要在外界使用中的模块,需要在__init__.py中指定对外界提供的模块列表

1
2
3
# 从 当前目录 导入 模块列表
from . import 模块1
from . import 模块2

发布模块

如果希望自己开发的模块,分享给他人,可以按照一下步骤

制作模块压缩包

创建setup.py

路径同所要发布的包在同一目录下
setup.py文件很固定

1
2
3
4
5
6
7
8
9
10
11
#-*-coding:utf-8-*-
from distutils.core import setup

setup(name='craw_picture', # 包名
version='1.0', # 版本
description='', # 描述信息
long_description='', # 完整的描述信息
author='', # 作者
author_email='', # 作者邮箱
url='', # 个人主页
py_modules=["包名.模块1","包名.模块2"])

最后一个参数很关键,在列表中需要指定包中的模块

构建模块

在终端中进入setup.py所在目录,然后执行python3 setup.py build
会在当前目录下生成build目录,其中build目录下的lib文件中有完整的包

生成发布压缩包

在终端执行python3 setup.py sdist
当前目录下会生成dist目录,其中有一个压缩包就是我们要分享的包

安装模块

首先把压缩包解压,进入目标包目录下,然后使用root身份进行安装

1
2
tar -zxvf 压缩包
sudo python3 setup.py install

卸载模块

直接从安装目录下,把安装模块的目录删除就可以
先找到安装目录包名.__file__
然后去对应目录删除相应文件

pip 安装第三方模块

第三方模块通常是指由知名的第三方团队开发的并被程序员广泛使用的python包/模块,例如pygame

pip是一个现代的通用的Python包管理工具
提供了对Python包的查找、下载、安装、卸载等功能

安装卸载命令如下

1
2
3
4
5
6
# 将模块安装到Python2.x环境中
sudo pip install pygame
sudo pip uninstall pygame
# 将模块安装到Python3.x环境
sudo pip3 install pygame
sudo pip3 uninstall pygame