Python中的包和模块

Python中的包和模块

概念解释

  • 模块: 为了使代码更加容易维护,提高代码重用价值,可以将一组相关功能的代码写入一个单独的py文件中供别人使用,这个.py文件就叫做做一个模块
  • : 包是一个有层次的文件目录结构,它定义了由n个模块或者n个子包。具体的表现形式就是每一个包下都包含 __init__.py,这个目录下一定有 __init__.py 文件和其他模块或子包
  • :参照了其他的编程语言的概念,具体表现也是一个模块或者是包,表示的是完成一定功能的代码合集。
  • 框架: 表示的是一个架构层的概念,从库功能的角度来看,解决一个开放性的问题二设计的具有一定约束性的支撑框架。通过一个框架,可以快速实现一个问题解决的骨架。针对这个已经设计好的框架去进行角色填充。

包和模块的分类

1. 标准的包和模块

安装Python之后,自动安装好的一些系统模块,可以直接导入使用。每一个安装Python的用户电脑上都有这个模块,满足了基本的开发需求。
在Python中有一些预制的模块,就是存放在builtin模块中,在Python 3中存放在builtins 模块中。比如说print函数就是属于这个预制模块中的。

2. 三方包和模块

非系统自带安装模块,属于第三方开发人员开发的,需要下载和安装才可以使用。

3. 自定义的包和模块

我们自己开发的一些包和模块,发布出去给别人用。

包和模块的位置

当我们使用Python的编译器工具,比如Pycharm时,我们导入一个包,把鼠标放在这个导入的模块上,就会出现这个模块或者包存放的位置。

在这里插入图片描述

或者使用print(os.__file__) dir(XXX)查看到这个模块所在的位置,其中XXX表示的待查看的模块的名字。

包和模块的导入

模块的导入

单个模块的导入 import M 
多个模块的导入 import M1, M2
导入的时候取一个别名 import M as 别名

包的导入,不能直接 import package_name , 如果直接导入一个包,整个包不会被完全导入,只会导入了__init__.py 这一个初始文件

单个包的导入 import package.M
多个模块的导入 import p1.M1, p2.M2
导入的时候取一个别名 import p1.M as 别名

导入包的时候还可以借助于from 语句, from A import B[as c]

引入单个模块

from p1 import M1

引入这个包的多个模块

from p1 import M1, M2

引入时起别名

from p1 import M1 as mm1, M2 as mm2

发布一个软件包

假设我们自己开发了一个软件包,并且我们要发布我们的软件包到pypi仓库上去,我们需要构建一个项目,这个项目的结构如下所示:

在这里插入图片描述
在项目取名的时候有几个命名建议是需要注意的

  1. 包名需要全部小写
  2. 多个单次以中划线-作为分割,不要使用 _ , 因为pip安装使用 _ 支持不是很友好
  3. 包名不能合pypi上已经有的重名

在这里我们的setup.py是写了项目信息的配置文件,这里面有一个执行函数,通过这个函数来知名信息。写setup函数的方式有两种

在这里插入图片描述

在这里参数的说明就有以下一些:
下面是必填选项
在这里插入图片描述

除此之外还有需要处理的单文件模块列表
作者信息
作者邮箱
长描述
依赖的其他包

可以查看广泛文档 Packaging and Distributing
在这里插入图片描述

在setup.py文件中,我们可以设置如下信息:

# from distuils.core import setup # 这两个打包方式二选一
from setuptools import setup

setup(name="abc",version="1.0.1",description="this is a package description", package=['pa','pb'],py_modules=['tool'],author='green grape',author_email='ax@XX.com',long_description="XXXX", url="https://github.bighug")

写好我们的设置文件之后,我们可以通过如下的命令来发布我们的package。

python3 setup.py sdist

按照这样一个打包命令生成的包是一个源码包,这个源码包 生成的格式如下:abc-1.0.1.tar.gz 这里的命名规则和你在setup中的配置是一样的

README.rst文件

除了上面这些信息,我们在打包文件中还有一些文件叫做README.rst 文件。这个文件可以使用特定的字符来描述文本的格式。pypi平台能够自动识别long_description字段所写的这种格式的字符串。
但是,如果把字符串都写在setup函数参数中,会显得比较混乱,所以,一般把内容写在一个单独的README.rst文件中,然后在setup.py文件中读取这个文件的命令,赋值给我们的long_description即可。

这个README.rst文档支持格式是与markdown格式编辑一样的,rst 表示的是reStructuretext 格式。

这个文件的作用就是防止setup传入的参数太长,影响整个文件的可读性。

因此针对setup.py 这个文件我们可以这么处理:

from distuils.core import setup
from setuptools import setup

# 定一个参数读取readme.rst这个文件
def readme_file():
	with open("README.rst",encoding='utf-8') as rf:
		return rf.read()

setup(name="abc",version="1.0.1",description="this is a package description", package=['pa','pb'],
py_modules=['tool'],author='green grape',author_email='ax@XX.com',long_description=readme_file(), 
url="https://github.bighug")

注意,我们把readme.rst文件和 setup.py放在同一个目录下面

在这里我们可以安装一个包来检测我们写的README.rst的语法写的对不对

具体的命令是:

pip install readme_renderer

安装好之后,我们可以进入到我们打包的文件的目录当中

然后运行下面的命令,可以检查我们写的README.rst文件对不对。

python setup.py check -r -s

也可以通过比如说 pycharm中的运行文件,生成html之后能够生成对应的文本,在浏览器中打开,查看运行之后文本结果

License.txt文件

用于申明库的一些使用责任等等,所有归属权,别人是否能够对代码进行操作。

我们也可以在setup.py 这个文件里面的setup函数里面字段申明我们使用 的许可证类型

# from distuils.core import setup
from setuptools import setup

# 定一个参数读取readme.rst这个文件
def readme_file():
	with open("README.rst",encoding='utf-8') as rf:
		return rf.read()

setup(name="abc",version="1.0.1",description="this is a package description", package=['pa','pb'],
py_modules=['tool'],author='green grape',author_email='ax@XX.com',long_description=readme_file(), 
url="https://github.bighug", license="MIT")

MANIFEST.in 文件

在我们使用打包命令的时候,会把readme文件放到我们的压缩包,但是license这个文件可能就不会被放到压缩包里面。如果我们需要在打包的时候在我们发布的包中存放我们需要的文件,我们就需要利用到我们的MANIFEST文件来控制我们生成的打包文件的清单。
如果是使用的时候,我们使用的setuotool会自动帮你把readme打包进去,如果使用的打包工具是distutils 那么就需要我们在MANIFEST文件中写如readme

MANIFEST.in 的构建格式如下所示:

include LICENSE
include README.rst
include *.txt

包的发布

我们在发布包的时候,如果是发布源码包,这个时候生成发布包的命令如下:

python setup.py sdist 

这样生成的包是一个固定的打包格式,tar.gz

当然我们还可以用参数 --format = 压缩格式选项生成不同的压缩包格式

比如说常见的压缩包格式: zip, gztar,ztar, tar, bztar等

python setup.py sdist --format=zip,tar

在这里,s表示的是源码 source, 表示的是发布包的形态是源码形态的

python setup.py bdist 

表示的是会把源码包编译成为一个二进制包

生成的二进制文件都放在__pycache__ 文件夹下面

在这里插入图片描述

除此之外,我们还有一些其他的命令

python setup.py bdist_egg  # 要使用egg的包我们需要安装setuptool

python setup.py bdist_wheel  # pip install wheel

python setup.py bdist_wininst  # windows下的安装环境运行的包

安装方式

针对源码安装的包我们直接可以通过下面的这三种模式来处理
在这里插入图片描述

针对二进制的包,我们是直接解压缩之后把里面的内容复制到我们安装包目录中的Lib下面的site-packages这个里面接可以了

针对使用 python setup.py bdist_wininst # windows下的安装环境运行的包 生成的exe文件,在Windows的环境下可以直接双击运行,

在这里插入图片描述

和一般的软件安装的步骤是一致的或者说类似。

针对下载下来的egg的包我们可以通过 easy_install XXX.egg去安装完成

针对我们下载的.whl格式的包,我们可以通过easy_install XXX.whl这样的一个格式去安装,也可以通过 pip install XXX.whl 去安装

在这里插入图片描述

发布指定的目标文件

如果我们开发了一个工具包,并且想将其上传到Pypi仓库,这个时候我们可以借助twine 这个库

使用下面这个命令我们就可以上传

twine upload XXX  # XXX 代表我们需要上传的包

在这里插入图片描述
当然,安装的时候还可以指定安装的源,可以是来自于pypi官方仓库,也可以指定镜像仓

pip install XX --index-url https;//pypi.python.org/simple

简化版本如下

pip install XX -i https;//pypi.python.org/simple

参考文献

[1] https://www.bilibili.com/video/BV194411r7a8?p=1&vd_source=57623809cb42c86b58d359b44bfd8dcf



写在后面的话

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程 https://www.cbedai.net/chichoxian

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值