作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
当你写好一个Python项目时,想要开源或者给别的小伙伴使用,这个时候就可以考虑使用打包工具来做这个事情,Python内置的setup.py工具就自带了这个功能,本片博客将带你来打包一个自己写的python项目。
学会python打包后,可以把自己写好的模块发布到公共的PyPI(https://pypi.org/)上,也可以搭建PyPI私服,供企业内部使用。
目前PyPI里面的模块没用太好的审核机制,不保证安全,因此要慎重使用。据说,数据分析领域基于python的开源模块在不同的操作系统算出的结果竟然不同,这意味着所有基于该模块的计算发表的论文结果都是不准确的!
一.查找setup帮助文档
1>.找到setup的帮助文档,如下图所示
2>.如下图所示,点击"Distttributing Python Modules(Legacy version)"
3>.如下图所示,点击"Writing the Setup Script"
4>.阅读官网文档
5>.在自己的项目根目录下创建setup.py文件,修改内容如下所示
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @author :yinzhengjie
# blog:https://www.cnblogs.com/yinzhengjie
from distutils.core import setup
setup(
# 指定项目名称,我们在后期打包时,这就是打包的包名称,当然打包时的名称可能还会包含下面的版本号哟~
name='devops',
# 指定版本号
version='0.1.1',
# 这是对当前项目的一个描述
description='Python automatic operation and maintenance platform',
# 作者是谁,指的是此项目开发的人,这里就写你自己的名字即可
author='yinzhengjie',
# 作者的邮箱
author_email='y1053419035@qq.com',
# 写上项目的地址,比如你开源的地址开源写博客地址,也开源写GitHub地址,自定义的官网地址等等。
url='https://www.cnblogs.com/yinzhengjie/p/14124623.html',
# 指定包名,即你需要打包的包名称,要实际在你本地存在哟,它会将指定包名下的所有"*.py"文件进行打包哟,但不会递归去拷贝所有的子包内容。
# 综上所述,我们如果想要把一个包的所有"*.py"文件进行打包,应该在packages列表写下所有包的层级关系哟~这样就开源将指定包路径的所有".py"文件进行打包!
packages=['devops', "devops.dev", "devops.ops"],
)
二.使用setup.py工具对自定义package进行打包操作
1>.查看setup.py工具的帮助信息
python setup.py --help-commands
2>.编译python的包(本质上是新建了一个build目录,而后将指定的packages列表包下的所有".py"文件拷贝过去)
python setup.py build
3>.将源文件进行打包操作
python setup.py sdist
4>.基于我们刚刚打包的文件进行安装
pip install test/dist/devops-0.1.1.tar.gz
5>.卸载咱们刚刚安装的包
pip uninstall devops
三.bdist命令
bdist命令是一个二进制分发包,或称作安装程序。该命令可以生成模板操作系统的安装程序。
1>.制作windows下的安装包
python setup.py bdist_wininst # 创建"*.exe"的文件
python setup.py bdist_msi # 创建"*.msi"的文件
python setup.py bdist --format=msi # 同样是创建"*.msi"的文件
2>.制作rpm包
python setup.py bdist_rpm # 创建"*.rpm"的文件,该命令需要在Linux操作系统上执行!
python setup.py bdist --format=rpm # 同上
3>.制作压缩文件
python setup.py bdist --format=zip # 创建"*.zip"压缩文件
python setup.py bdist --format=gztar # 创建"*.tar.gz"文件
四.将python打包成egg包或者whl包(本质上是一个zip文件)
1>.安装wheel模块
pip install wheel
2>.修改"setup.py"文件
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @author :yinzhengjie
# blog:https://www.cnblogs.com/yinzhengjie
# from distutils.core import setup
from setuptools import setup # 注意哈,setuptools是基于distutils进行封装的,但打wheel包时要从setuptools包导入setup模块哟~
setup(
# 指定项目名称,我们在后期打包时,这就是打包的包名称,当然打包时的名称可能还会包含下面的版本号哟~
name='devops',
# 指定版本号
version='0.1.1',
# 这是对当前项目的一个描述
description='Python automatic operation and maintenance platform',
# 作者是谁,指的是此项目开发的人,这里就写你自己的名字即可
author='yinzhengjie',
# 作者的邮箱
author_email='y1053419035@qq.com',
# 写上项目的地址,比如你开源的地址开源写博客地址,也开源写GitHub地址,自定义的官网地址等等。
url='https://www.cnblogs.com/yinzhengjie/p/14124623.html',
# 指定包名,即你需要打包的包名称,要实际在你本地存在哟,它会将指定包名下的所有"*.py"文件进行打包哟,但不会递归去拷贝所有的子包内容。
# 综上所述,我们如果想要把一个包的所有"*.py"文件进行打包,应该在packages列表写下所有包的层级关系哟~这样就开源将指定包路径的所有".py"文件进行打包!
packages=['devops', "devops.dev", "devops.ops"],
)
3>.打包whl和egg格式,如下图所示
python setup.py bdist_egg # 打"*.egg"的包
python setup.py bdist_wheel # 打"*.whl"的包