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

相关推荐
湫ccc7 分钟前
《Python基础》之基本数据类型
开发语言·python
Matlab精灵8 分钟前
Matlab函数中的隐马尔可夫模型
开发语言·matlab·统计学习
Microsoft Word9 分钟前
c++基础语法
开发语言·c++·算法
数据小爬虫@11 分钟前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
qq_1728055919 分钟前
RUST学习教程-安装教程
开发语言·学习·rust·安装
wjs202426 分钟前
MongoDB 更新集合名
开发语言
monkey_meng30 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
legend_jz1 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
drebander1 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
tangliang_cn1 小时前
java入门 自定义springboot starter
java·开发语言·spring boot