欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python:模块和包

程序员文章站 2022-07-09 23:40:16
...

自己以前整理的笔记,不太完整,后续会不断更新。。。。


一、模块(module)

浏览程序目录会发现一个__pycache__目录,内部保存着.pyc文件(其中的c是compiled编译),这个文件是由python解释器将模块的源码转换为字节码后生成的,可优化程序的启动速度

  • python在解释源程序时是分两步走的:
    1. 处理源代码,编译生成一个二进制字节码
    2. 对字节码进行处理,生成机器码
  • 有了模块的字节码后,下一次运行程序时,若上次保存字节码之后没有修改过源代码,python将会加载.pyc文件并跳过编译步骤
  • 当python重编译时,它会自动检查源文件和字节码的时间戳
  • 如果你又修改了源代码,下次程序运行时,字节码将自动重新创建

模块的命名与标识符的命名规则一致

模块中定义的全局变量、函数、类都可提供给外界使用

01. 模块导入的方式

  1. 全部导入
import  模块名1,模块名2 # 可行,但不建议

# 推荐每行独立导入
import 模块名1
import 模块名2

# 简化模块名模块
import 模块名3 as 别名

以上方法一次性导入模块中所有工具

模块导入后可以通过模块名. 的方式调用模块中的全局变量、函数、类

注意:模块别名 应该符合 大驼峰命名法

# 不推荐使用
from 模块名 import *

上面的模块导入方法也可以将模块中的所有工具导入 ,并且使用时直接使用工具名但不推荐使用,因为一旦发生重名的情况,排查麻烦

  1. 部分导入
from 模块名 import 工具名

从模块中导入部分工具,导入之后可直接使用工具名 ,不需要通过模块名. 的方式调用

注意:

  1. 如果导入的两个模块工具名相同,后导入的模块会覆盖先导入的函数
  2. 如果发生冲突,可以使用as给工具名起别名
  3. 别名只是在使用的时候做区分,内存中还是导入时的工具名

02. 模块的搜索顺序

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

  1. 搜索当前目录有无指定模块
  2. 没有,则搜索系统目录

所以在自定义模块名时,不要和系统模块名重名,否则会导致导入当前目录下的模块

03. 开发常识

每个独立的.py文件都是一个模块

导入模块时,文件中的所有没有任何缩进的代码都会被执行一遍

一般模块都会写自测试代码,为保证测试代码在被导入其他程序中时不运行,需要将测试代码做一定的处理


# 代码最下方
# 测试代码封装在函数中
def main_debug():
    pass

# 根据__name__的值判断是否执行测试代码
if __name__ == '__main__':
    main_debug()

__ name__属性

是python的内置属性,如果在当前程序其值是_main_,如果被导入其他程序中运行,则其值是模块名

04.常用模块

04-1.os模块

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口

应用:python通过os模块来实现对文件系统的访问,由于python的跨平台性,os模块会根据不同的操作系统在后台实现操作文件及目录的功能,虽然在调用方法时其名称都是一致的。

操作 说明
os.remove(‘path/filename’) 删除文件
os.rename(oldname, newname) 重命名文件
os.walk() 生成目录树下的所有文件名
os.chdir('dirname') 改变目录
os.mkdir/makedirs('dirname') 创建目录/多层目录
os.rmdir/removedirs('dirname') 删除目录/多层目录
os.listdir('dirname') 列出指定目录的文件
os.getcwd() 取得当前工作目录
os.chmod() 改变目录权限
os.path.basename(‘path/filename’) 去掉目录路径,返回文件名
os.path.dirname(‘path/filename’) 去掉文件名,返回目录路径
os.path.join(path1[,path2[,...]]) 将分离的各部分组合成一个路径名
os.path.split('path') 返回( dirname(), basename())元组
os.path.splitext() 返回 (filename, extension) 元组
os.path.getatime\ctime\mtime 分别返回最近访问、创建、修改时间
os.path.getsize() 返回文件大小
os.path.exists() 是否存在
os.path.isabs() 是否为绝对路径
os.path.isdir() 是否为目录
os.path.isfile() 是否为文件

04-2.sys模块

sys模块是与python 解释器交互的一个接口,提供了一系列的函数和变量,用于操控python的运行时环境

一些应用:

操作 说明
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.path.append('c:/xxx') 临时添加模块搜索路径,程序结束后添加的路径失效
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit() 退出程序,正常退出时exit(0)
sys.modules.keys() 返回所有已经导入的模块列表
sys.modules 返回系统导入的模块字段,key是模块名,value是模块
sys.platform 返回操作系统平台名称

二、包(package)

  • 一个包是包含多个模块的文件夹,即包含多个.py文件
  • 且文件夹中包含一个特殊的文件_init_.py
  • 命名规则与标识符一致
  • **import 包名 **可以一次性导入包中的所有模块
  • 我们在导入一个包时,实际上是导入了它的__init__.py文件,其主要作用是限制外界访问模块的种类

外界要使用包中模块,需要先在_init_.py文件中设置外界可访问的模块列表:

# 从当前目录中导入模块
# 这里的模块列表是外界可访问的模块列表

from . import 模块名1
from . import 模块名2
# 或者直接导入模块
import 模块名3

__init__.py 中还有一个重要的变量,叫做 __all__

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']

当在其他python文件中使用from package import *时,就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来,而没注册的则不会导入

三、发布包

制作发布压缩包步骤:

  1. 创建setup.py
from distutils.core import setup

setup(name="hm_message",  # 包名
      version="1.0",  # 版本
      description="itheima's 发送和接收消息模块",  # 描述信息
      long_description="完整的发送和接收消息模块",  # 完整描述信息
      author="itheima",  # 作者
      author_email="[email protected]",  # 作者邮箱
      url="www.itheima.com",  # 主页
      py_modules=["hm_message.send_message",  # 发布的包名.模块名列表
                  "hm_message.receive_message"])

在要发布的包的同级目录下,创建一个setup.py文件内容模板如上

  1. 构建模块

python setup.py build

  1. 生成发布压缩包

python setup.py sdist

注意: 要制作哪个版本的模块,就使用哪个版本的解释器执行!

四、安装及卸载包

安装包

  1. 解压发布的压缩包

tar -zxvf 压缩包名

  1. 安装

进入到解压后的文件夹中运行以下命令

sudo python setup.py install

卸载包

直接从安装目录下,把安装模块的 目录 删除就可以(Ubuntu环境下的操作)

sudo rm -r 包文件

使用pip包管理工具

  1. window下

pip install 包名

  1. ubuntu下

sudo pip install 包名

sudo pip unistall 包名

python中关于模块的一些操作

查看模块的保存目录

import random
import tomd

print(random.__file__)
print(tomd.__file__)

查看python的安装路径

import sys
print(sys.executable)

# ubuntu中
which python