跳转至

模块和包

模块的引用

Python
1
2
3
4
5
6
7
8
# 常用模块导入方式
# 一、
#   import 模块名称
# 二、
#   from 模块名称 import 对象名称
#   如果导入的模块比较多可以使用:from 模块名称 import *(不推荐,可能会存在对象名称冲突问题)
# 三、
#   import 模块名称 as 关联名称

模块的执行过程

Python
1
2
3
4
5
6
7
8
# 当在模块中直接执行时,__name__的值是"__main__",当模块被其他代码调用的时候,此时
# __name__的值就是模块自身的名称对应的是py文件的名称,使用if __name__ == "__main__"
# 目的就是为了模块在调用的时候不执行测试代码,只执行模块对应的方法
def mian():
    pass

if __name__ == "__main__":
    mian()

Python 的包

Python
# python的包指在文件夹下存在的模块,通过点.进行调用比如文件夹TEST存在一个test.py此时需要调用该包下
# 模块就需要使用import TEST.test
# python3.3之前包的文件夹下必须要有__init__.py文件,之后的版本就没有强制要求
# 其中__init__.py文件可以在包创建前对包进行初始化

## 定义__init__.py文件,对包初始化
print(f"__init__.py文件被调用,此时__name__的值是{__name__}")

## 同样可以创建一个包的全局变量,但是在包的内部无法使用,而是被其他调用才会使用到
t = 1
## 同样,该变量可以进行修改,在引用该包的代码中可以进行修改该变量的值
Python
1
2
3
4
5
6
7
8
9
# 使用from 模块名称 import * 可能会出现对象名称冲突的问题,使用__all__方法,可以定义*可导入的模块
__all__ = ["aaa", "bbb"]  # 此时使用from 模块名称 import * 就仅仅可以导入aaa和bbb对象名称

# 如果在__init__.py定义__all__属性,则使用from 包名 import * 可以导入对应__init__.py中all属性的模块


# 总结
# 对于模块来说,如果没有定义__all__属性,那么from ... import *的语法将导入模块中的所有东西
# 对于包来说,如果__init__.py没有定义__all__属性,那么from ... import * 的语法则不导入包里所有的任何模块

共享包内容

Python
# 代码打包格式
project/                                # 项目的主目录
|—— LICENSE                         # 开源许可证
|—— pyproject.toml          # 指定安装环境
|—— MEADME.md                       # 项目介绍
|—— src/
|       |__ img_compress/       # 源代码主目录
|               |—— __init__.py # 包的初始化文件
|               |__compress.py  # 源代码
|__ tests/                          # 测试文件(可以为空)
Python
# 第一步:注册pypi账号
    # pypi代码上传平台:https://pypi.org/
# 第二步:配置文件编写
  # LICENSE:指定一个许可证书,告诉使用者,在什么情况可以使用代码,在什么情况可以二次开发代码,可借鉴使用的网站:https://choosealicense.com/
  # pyproject.toml:定义包的安装环境,并且指定安装套件的工具有哪些
# 第三步:代码打包
    # 需要用到包先进行安装:py -m pip install --upgrade build,确保更新到最新版本
    # 进入代码文件夹下执行:py -m build
    # 此时在文件夹下就会多了一个文件夹dist,里面存在两个包
# 第四步:长传至pypi平台
    # 安装包:py -m pip install upgrade twine
    # 上传:py -m twine upload --repository pypi dist/*
        # 此时要求输入ursername和passwd,通过进度行可以发现上传成功,并可以发现长传的地址链接