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的路径即可。

相关推荐
哈哈不让取名字2 小时前
基于C++的爬虫框架
开发语言·c++·算法
幻云20102 小时前
Python深度学习:从筑基到登仙
前端·javascript·vue.js·人工智能·python
花间相见2 小时前
【JAVA开发】—— Nginx服务器
java·开发语言·nginx
扶苏-su2 小时前
Java---Properties 类
java·开发语言
仰望星空@脚踏实地3 小时前
本地Python脚本是否存在命令注入风险
python·datakit·命令注入
LOnghas12113 小时前
果园环境中道路与树木结构检测的YOLO11-Faster语义分割方法
python
一条咸鱼_SaltyFish4 小时前
远程鉴权中心设计:HTTP 与 gRPC 的技术决策与实践
开发语言·网络·网络协议·程序人生·http·开源软件·个人开发
我即将远走丶或许也能高飞4 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
沐知全栈开发4 小时前
SQL LEN() 函数详解
开发语言
钟离墨笺4 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang