使用setuptools打包

当我们写一个完整的项目,需要该项目文件中打包成分发包共享给他人或者上传到pypi社区以供他人下载。这就需要对该项目进行打包分发。

项目文件

这是一个已写好的项目文件包,叫做my_pkg,它的目录结构如下:

tutorial/

my_pkg/

__init__.py

main.py

utils/

__init__.py

other.py

在my_pkg中有两个文件和一个子包utils,现在我们需要对这个my_pkg进行打包。

创建包文件和setup.py文件

my_pkg是将打包的Python包文件,在my_pkg的同级目录下分别创建以下文件:

setup.py ---- 打包脚本文件,执行该脚本将自动完成打包

LICENCE ---- 许可证文件

README ---- 包的介绍和说明

创建后文件目录结构如下:

tutorial/

my_pkg/

__init__.py

main.py

utils/

__init__.py

other.py

setup.py

LICENCE

README

setup.py配置

打开setup.py文件,写入以下内容

import setuptools # 导入setuptools, 基于setuptools模块进行打包分发

# 将readme文件中内容加载进来,作为对包的详细说明(可以不需要)

with open("README.md", "r") as fh:

long_description = fh.read()

# 调用setuptools的setup进行打包,通过参数配置指定包的信息,这是打包的关键设置

setuptools.setup(

name="my_pkg", # 这是该包的名字,将来可能使用pip install 该包名直接下载

version="0.0.1", #版本号,

author="Example Author", #作者

author_email="author@example.com", # 作者邮箱

description="A small example package", # 包简短的描述

long_description=long_description, # 详细的描述,这里使用从readme中读取的内容

long_description_content_type="text/markdown", # 详细描述来源文件的文件类型,这里使用markdomn

url="https://github.com/pypa/my_pkg", # 可以将项目上传到github,gitlab等,在此指定链接地址以供下载。

# 指定需要打包的内容,输入需要打包包名字符串列表,打包时不会自动获取子包,需要手动指定,例如:["my_pkg", "mypkg.utils"]

packages=setuptools.find_packages(), # 使用该函数可以自动打包该同级目录下所有包

classifiers=[ # 指定一些包的元数据信息,例如使用的协议,操作系统要求

"Programming Language :: Python :: 3",

"License :: OSI Approved :: MIT License",

"Operating System :: OS Independent",

],

python_requires='>=3.6', # 该包的Python版本要求

)

setup.py中除了上述内容,还可以添加包括以下的信息

name package name

version (-V) package version

fullname -

author the author's name

author-email the author's email address

maintainer the maintainer's name

maintainer-email the maintainer's email address

contact the maintainer's name if known, else the author's

contact-email the maintainer's email address if known

url the URL for this package

license the license of the package

licence for --license

description the package description

long-description the long package description

platforms the list of platforms

classifiers the list of classifiers

keywords the list of keywords

provides the list of packages/modules provided

requires the list of packages/modules required

obsoletes the list of packages/modules made obsolete

setup.py配置完成后,就可以执行这个文件进行打包了(在命令行使用Python解释器指定参数执行,不能直接执行),在此之前还有LICENCE和README两个文件需要完善(也可以不做处理,不影响打包执行)。

README

这个文件是该包的详细说明文件,包括各种信息,例如该包如何安装,需要的环境,如何使用等详细内容。

LICENCE

指定许可证信息,开源软件都遵循了不同的开源协议,这些协议规定了使用者使用该包后必须遵守的原则,可以查看不同开源协议内容 https://choosealicense.com/ ,选则一个协议,复制对应的协议内容到该文件中即可:

示例选择MIT协议

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy

of this software and associated documentation files (the "Software"), to deal

in the Software without restriction, including without limitation the rights

to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

copies of the Software, and to permit persons to whom the Software is

furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all

copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

SOFTWARE.

通过setup.py生成分发包

setup.py文件配置完成后,就可以通过Python执行进行打包,使用cmd命令行工具打开终端,cd 到setup.py文件所在目录(windows 可以在文件资源管理器中的setup.py目录上方路径中直接cmd,直接在该目录打开终端)

打包成wheel二进制包

这需要最新的setuptools 和 wheel包。执行以下命令更新

python -m pip install --user --upgrade setuptools wheel

执行该setup.py文件并指定参数,指定打包为wheel二进制文件。

python setup.py sdist bdist_wheel

执行该命令后,该目录下会多出三个目录。在dist目录下就是我们打包好的源代码文件(tar.gz)和wheel二进制文件(.whl)。

build

dist/

my_pkg-0.0.1.tar.gz # 被打包内容所有原代码,按照原有的层级结构

my_pkg-0.0.1-py3-none-any-whl # 可以通过pip install 直接安装

my_pkg.egg-info

现在我们可以及将这个dist文件夹中的内容共享给他人,也可以上传pypi社区供他人下载安装,在得到这个dist包后,可以通过pip安装命令直接安装内部的.whl文件。

pip install my_pkg-0.0.1-py3-none-any-whl

该命令会将这个包安装到python安装目录下/Lib/site-packages目录下,使用pip list命令可以看到在列表中出现了名为my_pkg的包名,安装成功。该包可以使用了。

如果将该包上传到pypi社区供他人下载,需要注意自己包名不要和其他贡献者的包名相同,如何判断是否重复,尝试在未上传前使用pip isntall 包名进行安装,若没有找到找到该package表示该名可用,也可以上pypi官网搜索。上传成功后,直接使用pip install 包名进行安装。上传pypi过程见官网示例https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives

打包为源码包-sdist

通过wheel二进制文件打包是目前较为流行的方式。除了wheel二进制文件,我们还可以使用Python源代码压缩文件形式进行打包。同样在setup.py同级目录下,进入cmd命令行,执行命令

python setup.py sdist

将会在创建dist和my_pkg.egg.info目录。我们只关心dist目录,该目录下有一个压缩文件,这个压缩文件包含了打包后的全部源码。

dist/

my_pkg-0.0.1.tar.gz

将该文件发送给他人,可以直接使用pip install my_pkg-0.0.1.tar.gz直接安装该包,同样在使用pip list可以查看到该包名。

另外,还可以解压该源码包,在setup.py目录执行python setup.py install安装该包。

二进制安装程序-bdist

打包为二进制安装包,生成目标操作系统的安装程序。

生成windows 安装程序

针对windows环境下,以下三条命令均可

python setup.py bdist_wininst

Python setup.py bdist_msi

python setup.py bdist --format=msi

创建一个dist目录,生成一个安装程序,在Windows上直接双击即可安装该包。

生成rpm包

python setup.py bdist_rpm

python setup.py bdist -- format=rpm

在Linux系统中使用rpm命令进行安装。

生成压缩文件

python setup.py bdist --format=zip

python setup.py bdist --format=gztar

python工程文件如何打包_python 项目打包相关推荐

  1. myeclipse打包java文件_MyEclipse将Java项目打包成jar文件的三种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MANIFEST.MF", 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFE ...

  2. vue 计算文件hash值_vue项目打包文件增加hash值

    vue项目打包文件增加hash值 vue-cli2项目 修改vue项目根目录下的 build/webpack.prod.conf.js文件 js文件: output: { path: config.b ...

  3. python删除文件某行_python 文件操作删除某行的实例

    python 文件操作删除某行的实例 使用continue跳过本次写循环就可以了 #文本内容 Yesterday when I was young 昨日当我年少轻狂 The tasting of li ...

  4. vue项目打包publicpath_Vue项目打包路径问题

    最近在搞Vue CLI的项目打包,出现了常见的路径问题,经过研究问题和文档,现在有了自己的看法,以下所有内容都是建立在Vue CLI3之上. 关于vue.config.js文件: 这个文件的配置主要是 ...

  5. java xml格式打包,maven项目打包xml没有被打包解决办法 ,mybatis的xml打包

    在打maven包是遇见一个问题:打完包发现src/main/java中的的mapping没有被打包进去: 原因主要是mapping目录里面的文件都是xml文件并不是.java文件,而maven打包默认 ...

  6. python查看文件行数_python如何获取打开文件的行数?

    距离上次写爬虫文章已经过了许久了,之前写过一篇20行Python代码爬取王者荣耀全英雄皮肤 ,反响强烈,其中有很多同学希望我再写一篇针对英雄联盟官网的皮肤爬取,但苦于事情繁多,便 2020-11-28 ...

  7. python下载文件暂停恢复_python下载文件记录黑名单的实现代码

    具体代码如下所示: #!/usr/bin/python # -*- coding: GBK -*- # -*- coding: UTF-8 -*- from ftplib import FTP imp ...

  8. python操作文件和目录_Python操作文件和目录

    Python操作文件和目录 读写文件比较简单,有一点特别注意就好了 windows下Python默认打开的文件以gbk解码,而一般我们的文件是utf-8编码的,所以如果文本含有中文,就会出现异常或者乱 ...

  9. python中文件描述符_Python中的描述符

    python中文件描述符 In Python, a class that implements a get, set or delete methods for an object is called ...

  10. python获取文件读写权限_Python 查看文件的读写权限方法

    实例如下: # -*- coding: utf-8 -*- # @author flynetcn import sys, os, pwd, stat, datetime; LOG_FILE = '/v ...

最新文章

  1. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(4月16日-4月22日)
  2. 6.0的版本的 tc,不支持大漠对象做数组吗?
  3. 解惑(二)----- 如何通俗地理解Python中的if __name__ == ‘__main__‘
  4. 团子大家族(clannad)
  5. 命令行下jq才是JSON 处理利器呀
  6. 教大家白嫖图床,有的小伙伴跟我说图床不好整,太麻烦
  7. 企业Java中事务隔离级别的初学者指南
  8. 中小企业ERP实施的项目管理
  9. MHA命令系统介绍--masterha_manager
  10. win2008r2 mysql 远程_SQL SERVER 2008 R2如何开启数据库的远程连接(转)
  11. 新建文件夹和文件,并向文件中写入数据---------Android
  12. 简明Linux命令行笔记:nl
  13. 机器学习基础(二十四)—— Random Forest
  14. python commands执行不连续_python中的commands模块,执行出错:'{' 不是内部或外部命令,也不是可运行的程序 或批处理文件。...
  15. Web端QR二维码扫描实现
  16. jmeter录制 过滤_Jmeter(二)-使用代理录制脚本
  17. healthkit简介
  18. 如果你毕业想进央企, 那就选这些大学, 性价比很高
  19. 2022年烟花爆竹经营单位安全管理人员培训试题及模拟考试
  20. 编写计算机程序的几个步骤,第1讲程序设计的一般步骤ok.doc

热门文章

  1. 【背包问题】基于matlab模拟退火算法求解背包问题【含Matlab源码 108期】
  2. 传统音乐制作与计算机音乐制作,论电脑音乐制作与传统音乐制作的方式对比
  3. 西蒙决策_西蒙的象棋因子
  4. java常用类objet,Java基础-常用API-Object类
  5. python:使用split以.划分句子、对列表进行切片
  6. springboot内存占用大_《SpringBoot整合redis、Scheduled/quartz定时任务》
  7. html静态页面作跳转
  8. “导航技术”学习笔记
  9. 什么时候建立分区的时候需要建立EFI分区
  10. 企业选型数据库系统的五点建议