Python文件制作tar.gz包(源码包)
setup.py文件的编写
setup.py中主要执行一个 setup函数,该函数中大部分是描述性东西,最主要的是packages参数,列出所有的package,可以用自带的find_packages来动态获取package。所以setup.py文件的编写实际是很简单的。
例如我们写了一个foo.py
foo.py
def explain(name): print(f'Sorry, I am {name}, I do not want to foo you but this is a practice to learn setuptools.') if __name__ == '__main__': explain('hxx')
想能够像个包一样把它导入其他程序
现在我们想安装它
创建一个setup.py文件 (setup.py撰写规范)
import setuptools #定义包的一些属性 setuptools.setup( name='hxx_learn', version='1.0', description='print hello world', author = 'hxx', author_email = 'test@test.com', url='', #假如你的这个包有个介绍网站或者github之类的,就可以写上 packages = setuptools.find_packages('./') )
字段含义
- name:包名称.
- version (-V):包版本
- url:程序的官网地址
- description:程序的简单描述
- packages:需要处理的包目录(包含__init__.py的文件夹)
- py_modules:需要打包的python文件列表
- data_files:打包时需要打包的数据文件,如图片,配置文件等
- scripts:安装时需要执行的脚步列表
- package_dir:告诉setuptools哪些目录下的文件被映射到哪个源码包
- requires:定义依赖哪些模块
- entry_points:控制命令的
- find_packages() 默认在和setup.py同一目录下搜索各个含有 __init__.py的包。如果有多个含有 __init__.py的包,会都打包到一起。
- zip_safe: 等于False的话,不压缩包,而是以目录的形式安装
要想把这个包能打包分发,mypackage下一定要有__init__.py文件,空的就行
否则,后面执行python setup.py sdist也会成功执行,但是生成的压缩文件里是不包含my_package的
打包
这就是在构建一个源码发布包
python setup.py sdist 将源码打包成 tar.gz (用于 Linux 环境中)或者 zip 压缩包(用于 Windows 环境中)
python setup.py sdist
之后会生成dist目录和hello.egg-info目录
dist下的tar.gz文件是以setup.py中定义的name和version命名的
目录结构是这样的
解压hxx_learn.1.0.tar.gz得到是这样的
即生成的foo.egg-info其实已经被打包进tar.gz文件里了,还有hxx_package的源码
dist下的hxx_learn-1.0.tar.gz我们就可以发给其他人,他们就可以通过pip去安装了
在另一台服务器上
可见,它也是build 成 wheel
pip list可以看到
安装完后就可以调用了
所以,虽然我们安装的库名字叫做hxx-learn,但是调用的时候并不会有hxx-learn出现
制作python包为wheel文件(二进制包)
wheel是一个已经编译好的包,在安装时不需要编译过程,安装whl文件时要比发布的源文件安装要快。
python setup.py bdist_wheel
制作成wheel和制作成tar.gz是并列的,既可以制作成wheel又可以制作成tar.gz
例如现在还是
执行python setup.py bdist_wheel
之后会生成 build, dist 和 egg-info目录
目录结构是这样
现在whl文件就可以分发给别人安装使用了
另一台服务器上
pip list显示
安装完后就可以调用了
分发给别人本地开发使用
正常情况下,我们都是通过上面两种情况构建源码包或者二进制包然后分发给别人进行模块的安装的。
但是当像mmdetection框架这样,要分发给用户进行二次开发的,这样就不能给别人tar.gz或whl的安装包了,所以就把整个文件目录给别人,别人pip install -e . 安装,就可以继续开发了。
这条命令不会真正安装包,而是在系统环境中创建一个软连接指向包实际所在的目录,这样修改了相关文件之后不用再安装便能生效,便于开发调试等
所以通常只有这种情况下才会需要这种本地安装。而很少会有给别人文件目录,然后让别人python setup.py install来安装的,这和打包成tar.gz或whl没区别了,除非是想让别人方便看一下源码(因为有了whl文件,只要后缀改成zip再解压也能看到源码)
直接将你的目录发给别人,在其他服务器上
执行pip install -e . (or python setup.py develop)
执行之后目录下多了egg-info文件
pip list已经可以看到了
可以执行了
Python使用setuptools打包自己的分发包并使用举例(setup.py)
于 2022-04-20 16:00:13 首次发布