目录
一:setup.py文件的书写
二:setup.py 各个打包命令的使用:所需要用到的只有4个命令build / install / sdist / bdist
1:build: python setup.py build
2:install: python setup.py install
3: sdist : python setup.py sdist
4: bdist
三:包上传pypi
四:python安装包的两种形式
五:.egg和.whl文件
六:包上传pypi时候需要注意的问题:
一:setup.py文件的书写
参考:Python 库打包分发(setup.py 编写)_qq314000558的博客-CSDN博客
重要的参数:
packages / py_modules / scripts;
其中scripts指各种可执行脚本(比如.sh文件等,可以直接命令行xxx.sh文件执行),它所指定的文件会被直接复制到python可执行目录(好像是/usr/bin,这不重要,感兴趣可以自查)下;
现在,我们先构建如下目录结构的工程项目(为了不让大家混淆,我这里先把vsersion版本号去掉):
二:setup.py 各个打包命令的使用:所需要用到的只有4个命令build / install / sdist / bdist
1:build: python setup.py build
build相当于把需要打包的文件先收集起来,如下,它将我们packages下的包都收集起来了,可以看到因为我们指定了exclude = [‘download'],所以bulid/lib下是没有download这个文件包的。
2:install: python setup.py install
install会将build/lib下的文件以及egg-info进行打包并进行二进制化成.egg文件,该文件在当前文件夹下的dist文件夹下,并且,会把这个egg文件复制到对应环境的site-packages包下面,此时可以直接import 这个egg中的内容,但是无法跳转,另外还会生成egg-info文件夹,里面就是一些日志文件:
参考:Python包的安装与导入详解(whl, egg)_python 安装egg_�Sintol·D·Kevin的博客-CSDN博客
此时的目录是这样(版本号遮掩先):
此时取到对应虚拟环境的site-packages下面可以发现dist下对应的egg文件
对这个egg文件进行unzip可以看到其实就是我们setup.py中packages中指定的几个包,再加上egg-info文件夹:
这个时候,在这个环境下就可以直接import visualization/model/logger这些了,但是不可以import xjm.visualization/model/logger,因为egg是这些包的打包,不存在xjm这个包;想上面参考中说的一样,如果在site-package下面解压这个egg包,那么在pip list和conda list下就可以看见visualization/model/logger这些了,而且调试的时候也可以跳进这些文件,但如果不解压的话,不仅调试的时候进不去,而且pip list和conda list下看不见。
3: sdist : python setup.py sdist
python setup.py sdist不会生成build文件夹,只会生成dist和egg-info文件夹;但此时dist下面的不是egg文件,而是tar.gz文件,是一个打包文件,也是打包的相同的东西;
4: bdist
网上说sdist和bdist的区别一个是源码包,一个是二进制包;这里看到,bdist会同时生成build,dist,egg-info文件夹,且dist下面也会生成tar.gz文件,但我们可以看到,sdist和bdist生成的两个tar.gz文件是不一样的。
三:包上传pypi
针对install生成的egg文件,sdist和bdist生成的tar.gz文件,我们来讨论该怎么上传pypi;
我们要把自己写的代码上传到pypi,供别人pip install,需要做两步:一是打包,即将你需要上传的代码进行打包,这一步就是我们第二大点中各个命令的作用,其中install生成的egg文件,sdist和bdist生成的tar.gz文件就是我们打包好的文件;第二步上传,网上有两种上传方式,python setup.py upload和twine upload dist/*,实验结果结合网上查证,第一种python setup.py upload已经弃用,目前上传pypi,都只能用twine upload dist/*。另外,twine需要单独pip,即pip install twine。
对于install生成的egg文件,sdist和bdist生成的tar.gz文件;三个都可以通过twine上传,但是install生成的egg文件和bdist生成的tar.gz文件无法通过pip install来下载,只有sdist的可以。且此时pip install下来的东西就是各个包了,像上面的logger/model/visualization这些包就直接在site-packages目录下了,另外还会有个dist-info文件,其实就是egg-info文件,一些说明信息,其实就是一些;不像install,只会有一个二进制的.egg文件
所以,要上传包到pypi的话,通过以下两步即可:
pip setup.py sdist / twine upload dist/*.tar.gz
四:python安装包的两种形式
一种就是我们常见在线的pip install; 另外一种离线安装方式,我相信很多同学也遇到过,有时候我们从git上面拉下来的一个项目,在安装过程中会让你进入到某个文件夹,然后执行python setup.py install 命令,所以python setup.py install也是一种安装包的方式;
五:.egg和.whl文件
两者其实都是压缩包,相当于.zip的别名,是可以直接通过unzip解压的。
六:包上传pypi时候需要注意的问题:
版本号必须是新的,不能重复,另外,即使你把你之前上传到pypi的东西删掉了,这个东西的命名你也不可以用。
另外,上传的包有一点滞后性,需要上传几分钟后才可以pip install。