python实现封装代码为模块直接pip install安装

发布时间:2022-4-22 10:22

有很多的团队喜欢研发一些框架,并开源出来,然后我们直接pip install model_name,就可以使用别人的框架了,那么这个过程是如何实现的呢?就是别人本地写好的代码仓库,然后我们可以直接pip install安装,现在分享一下。

在这里插入图片描述

这里做个示例,现在我需要将fish代码文件夹封装并重新命名为fishfish模块,可以直接pip install fishfish。然后和同级的fish目录下写一个setup.py文件,这个setup.py文件就是关于把我们的代码文件夹如何封装的参数配置。这里补充说明,一定一定要在你的代码文件夹下写一个__init__.py文件,这个文件可以为空。这个文件的意义是让我们的setuptools.find_packages认定这个文件夹是一个需要封装的模块包。 如果你的fish文件夹下还有其他的需要封装的模块,比如fish文件夹下还有一个文件夹叫cat,请也务必在cat里面添加一个__init__.py文件,这样就会识别出fish和cat都是需要封装的模块包。

setup.py文件内容如下:


from setuptools import setup, find_packages
setup(name='fishfish', #注意一定不要和pypi官网上之前出现过的模块名重复,不然报错
version='0.0.2',
description='just test',
author='fmc123653',
author_email='xxx@126.com', #这里务必填写正确的email格式
packages=find_packages(),# 表示你要封装的包,find_packages用于系统自动从当前目录开始找包
license="apache 3.0"
)

'''
name : 打包后包的文件名
version : 版本号
author : 作者
author_email : 作者的邮箱
py_modules : 要打包的.py文件
packages: 打包的python文件夹
include_package_data : 项目里会有一些非py文件,比如html和js等,这时候就要靠include_package_data 和 package_data 来指定了。package_data:一般写成{‘your_package_name’: [“files”]}, include_package_data还没完,还需要修改MANIFEST.in文件.MANIFEST.in文件的语法为: include xxx/xxx/xxx/.ini/(所有以.ini结尾的文件,也可以直接指定文件名)
license : 支持的开源协议
description : 对项目简短的一个形容
ext_modules : 是一个包含Extension实例的列表,Extension的定义也有一些参数。
ext_package : 定义extension的相对路径
requires : 定义依赖哪些模块
provides : 定义可以为哪些模块提供依赖
data_files :指定其他的一些文件(如配置文件),规定了哪些文件被安装到哪些目录中。如果目录名是相对路径,则是相对于sys.prefix或sys.exec_prefix的路径。如果没有提供模板,会被添加到MANIFEST文件中。
'''

然后命令行分别运行

python setup.py bdist_wheel # 打包为whl文件
python setup.py sdist # 打包为tar.gz文件

然后如下

在这里插入图片描述

我们代码文件夹封装的模块包的数据都在dist文件夹下。

然后上传到pypi官网,我们平时安装的模块都是这个网站上来的。

pypi官网:https://pypi.org/

先去pypi官网注册个账号,非常简单的,然后在你注册时填的邮箱上点击验证,一定要验证!!!。

然后再安装一个专门用来上传模块的包

pip install twine

然后在setup.py同级目录下输入

twine upload dist/*

表示将我们dist文件夹下的模块的数据上传到pypi,输入指令后会要求你输入你注册的pypi账号名和密码,然后就上传成功了。

在这里插入图片描述

这样就成功了,然后下面给出了你上传的模块的地址:https://pypi.org/project/fishfish/0.0.2/

在这里插入图片描述

这样就上传成功了,我们测试下:

pip install fishfish==0.0.2

在这里插入图片描述

我们在python里面导入模型看看,结果报错了。

在这里插入图片描述

说是不存在fishfish这个模块,这里又引出一个小细节了,回到我们的文件夹,我们的文件夹名字叫fish,虽然我们存放在pypi官网上的模块名叫fishfish,但是下载到本地的包后,名字是完全和我们原来的文件夹名字对齐的,所以我们的包的名字应该是fish。

再测试下:import fish

在这里插入图片描述

成功了。

我们也可以直接到python安装的所有包的目录下看看有没有。

可以直接输入

importnumpy
print(numpy.__file__)

在这里插入图片描述

就看到了python安装的所有模块的存放地址,来到对应的site-packages目录下。

在这里插入图片描述

找到了。

PS:这里再补充下,一开始我在服务器上pip install fishfish==0.0.2报错找不到对应模块,查看了下服务器环境配置,原来是学长把服务器安装环境默认成了清华的镜像,清华镜像地址如下:

https://pypi.tuna.tsinghua.edu.cn/simple/

但是我们上传的包是在pypi官网上,地址是

https://pypi.org/project/

如果要针对具体的镜像安装模块,执行下面操作就行:

pip install fishfish==0.0.2 -i https://pypi.org/project/
pip install fishfish==0.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

希望我的分享对你的学习有所帮助,如果有问题请及时指出,谢谢~

Vue3学习笔记之依赖注入Provide/Inject 网站建设

Vue3学习笔记之依赖注入Provide/Inject

Provide / Inject 通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果...
Vue3全局实例上挂载属性方法案例讲解 网站建设

Vue3全局实例上挂载属性方法案例讲解

在大多数开发需求中,我们有时需要将某个数据,或者某个函数方法,挂载到,全局实例身上,以便于,在项目全局的任何位置都能够调用其方法,或读取其数据。 在Vue2 中,我们是在 main.js 中 直...