python自定义库的打包和安装

要将自定义库安装到python的三方包地址site-packages中,除了可以直接的复制之外,更为合理科学的方法是通过build和install的方式进行。因为直接复制仅仅作为一种临时的简单的方法,而且只能针对源码进行,也不好进行科学管理,相对的tricky一些,后者才是更为科学合理的工作流。

通过打包的方式进行,其需要先将原始的自定义库进行build,生成wheel文件或者压缩后的源码文件,然后通过pip直接安装即可。当然这里对库进行打包,需要依赖专门的工具,本文使用的是相对简单的flit工具。

安装flit

首先如果环境中没有flit,那么需要先安装,其是一个python的三方库,直接pip install flit即可。

初始化

在build之前,需要先对需要打包的库文件进行初始化,以生成描述库的meta data文件,后续的build依赖于这个文件。具体的方式就是在自定义库的文件夹所在的路径下方运行flit init即可,然后flit会通过交互式的命令行窗口让你补充完一些必要的信息,之后就会在当前目录下生成一个pyproject.toml文件,以及LICENSE许可文件。

这个时候就需要注意,flit对自定义库所依赖的其他三方库并不会自动感知,因此需要手动添加,直接在pyproject.toml中添加dependencies项即可,如下图所示,haha自定义库依赖numpy,则手动添加依赖项,如果没有指定版本,则安装的时候会安装最新版。如果没有添加依赖项,那么后续安装的时候,虽然可以成功安装项目库,但是并不会安装其依赖项,如果相应的python环境中原本就没有相应的依赖库,会导致安装后的自定义库无法正常运行。

build

初始化之后,再通过flit build即可打包,执行完该命令之后,默认会在当前路径下生成dist文件夹,里面会有源码打包的tar文件和wheel文件,这两种文件其实只需要其中之一就可,两者的区别在于源码打包文件往往针对需要本地编译的项目,比如自定义库中包含了c扩展,依赖于硬件,需要本地编译,那么就需要对源码打包,然后安装的之后再进行本地编译安装;wheel文件一般就是纯python项目,其直接build成平台独立的wheel文件,安装的时候更为高效简单。filt默认会同时生成这两种文件。

build之后,生成的文件就可以直接面向pip了,当然如果想把build之后的文件上传到pypi,那么可以通过flit publish实现,这个时候该库就会面向全网了,如果不需要publish到pypi,那么就可以直接进行本地安装了。

安装

build生成的wheel文件和tar文件,都可以通过pip直接安装。具体地,通过pip install name --find-links=your_wheel_tar_path -i https://pypi.tuna.tsinghua.edu.cn/simple安装即可,当然后面的-i https://pypi.tuna.tsinghua.edu.cn/simple是将默认的pypi服务地址改为国内清华镜像地址,避免网络原因造成其他依赖库的安装缓慢或者网络异常。

这里build生成的wheel文件或者tar文件可以分享给别人,让别人通过这种方式安装你的库,如果不想直接分享源码,可以把这个wheel文件发给别人(当然如果愿意,别人也有办法解析出源码),然后通过这种方式安装。这里需要说明的一点是,如果是本地安装,可以省去build过程,直接初始化之后,通过pip install your_project_path -i https://pypi.tuna.tsinghua.edu.cn/simple也可以直接安装,pip会识别路径下的pyproject.toml文件,安装相应的库和依赖项。

下载

有时候需要在其他机器上离线安装,那么除了自定义库自身的wheel或者tar文件之外,还需下载所有的依赖库,这个时候,可以通过pip download your_project_path -d your_project_path/dist -i https://pypi.tuna.tsinghua.edu.cn/simple命令,将依赖的所有库下载到项目打包文件一起,此时dist文件夹下的文件就可以满足其他机器的离线安装了,只需要在pip安装时,指定--find-links的路径即可。

相关推荐
睡美人的小仙女1274 小时前
Threejs加载环境贴图报错Bad File Format: bad initial token
开发语言·javascript·redis
rayufo5 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk5 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
缺点内向5 小时前
C#编程实战:如何为Word文档添加背景色或背景图片
开发语言·c#·自动化·word·.net
一起养小猫5 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
zhougl9966 小时前
Java 所有关键字及规范分类
java·开发语言
Python 老手6 小时前
Python while 循环 极简核心讲解
java·python·算法
java1234_小锋6 小时前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言
2501_944525546 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
qq_417129256 小时前
C++中的桥接模式变体
开发语言·c++·算法