使用Setuptools构建和分发软件包

参考官方文档翻译

开发人员指南

安装setuptools

安装最新版本的setuptools:

python3 -m pip install --upgrade setuptools

基本使用

引入setuptools基本使用

from setuptools import setup, find_packages
setup(
name="HelloWorld",
version="0.1",
packages=find_packages(),
)

要生成源代码分发,只需调用:

setup.py sdist

随着项目的增大将会包括一些依赖项,以及一些数据文件和脚本:

from setuptools import setup, find_packages
setup(
name="HelloWorld",
version="0.1",
packages=find_packages(),
scripts=["say_hello.py"], # Project uses reStructuredText, so ensure that the docutils get
# installed or upgraded on the target machine
install_requires=["docutils>=0.3"], package_data={
# If any package contains *.txt or *.rst files, include them:
"": ["*.txt", "*.rst"],
# And include any *.msg files found in the "hello" package, too:
"hello": ["*.msg"],
}, # metadata to display on PyPI
author="Me",
author_email="me@example.com",
description="This is an Example Package",
keywords="hello world example examples",
url="http://example.com/HelloWorld/", # project home page, if any
project_urls={
"Bug Tracker": "https://bugs.example.com/HelloWorld/",
"Documentation": "https://docs.example.com/HelloWorld/",
"Source Code": "https://code.example.com/HelloWorld/",
},
classifiers=[
"License :: OSI Approved :: Python Software Foundation License"
] # could also include long_description, download_url, etc.
)

下面我们将解释大多数这些setup() 参数的作用(元数据除外),以及在您自己的项目中使用它们的各种方式

指定项目的版本

官方的划分比较多,简洁的说一下:

版本:发行号+标签(交替出现)

发行号:2.1.0 (简单理解格式)

标签:类似alpha,beta, a,c,dev等,例如:一个不稳定的预发行版本,建议:2.1.0.a9,如果需要加入日期建议使用-,例如:2.1.0.9-20190604

可以使用该pkg_resources.parse_version()功能比较不同的版本号:

>>> from pkg_resources import parse_version
>>> parse_version("1.9.a.dev") == parse_version("1.9a0dev")
True
>>> parse_version("2.1-rc2") < parse_version("2.1")
True
>>> parse_version("0.6a9dev-r41475") < parse_version("0.6a9")
True

新增和更改的setup()关键字

include_package_data:如果设置为True,setuptools则表示将在MANIFEST.in文件指定的包目录中自动包含找到的所有数据文件。

exclude_package_data:将包名称映射到应该从包目录中排除的全局模式列表的字典

package_data:字典将包名称映射到全局模式列表。

zip_safe:一个布尔值(True或False)标志,指定是否可以安全地安装该项目并从zip文件运行该项目。如果未提供此参数,则bdist_egg每次构建鸡蛋时,该命令将必须分析项目的所有内容以查找可能的问题。

install_requires:一个字符串或字符串列表,指定在安装此版本时还需要安装其他发行版。

entry_points:字典将入口点组名称映射到定义入口点的字符串或字符串列表。

extras_require:字典将名称“ extras”(项目的可选功能)映射到字符串或字符串列表的字典,用于指定必须安装哪些其他发行版来支持这些功能。

python_requires:python版本设置。

版本号大于等于3.3,但是不能超过4
python_requires='~=3.3',
支持2.6 2.7以及所有以3.3开头的Python 3版本
python_requires='>=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4',

setup_requires:安装脚本执行时需要依赖的分发包,主要用于构建过程,注意,这里列出的包不会自动安装,如果需要,同时要在install_requires中指定。

dependency_links:满足依赖性时要搜索的URL的字符串列表

namespace_packages:命名项目的“命名空间包”的字符串列表

包括数据文件

对包含的文件进行更细粒度的控制(例如,如果您的软件包目录中有文档文件,并希望将其排除在安装范围之外),则还可以使用package_data关键字

setup.py
src/
mypkg/
__init__.py
mypkg.txt
data/
somefile.dat
otherdata.dat
from setuptools import setup, find_packages
setup(
...
packages=find_packages("src"), # include all packages under src
package_dir={"": "src"}, # tell distutils packages are under src package_data={
# If any package contains *.txt files, include them:
"": ["*.txt"],
# And include any *.dat files found in the "data" subdirectory
# of the "mypkg" package, also:
"mypkg": ["data/*.dat"],
}
)

如果想去掉readm.md等文件:

from setuptools import setup, find_packages
setup(
...
packages=find_packages("src"), # include all packages under src
package_dir={"": "src"}, # tell distutils packages are under src include_package_data=True, # include everything in source control # ...but exclude README.txt from all packages
exclude_package_data={"": ["README.txt"]},
)

参考示例

#!/usr/bin/env python
# -*- coding: UTF-8 -*- from setuptools import setup, find_packages """
setuptools使用文档: https://setuptools.readthedocs.io/en/latest/setuptools.html 生成源码发布包, 在灵犀工程目录(LingXi/)下执行: python3 setup.py sdist
""" setup(
name="LingXi",
version="1.5.0", # 发布前注意将此处改为本次发布的版本号
packages=find_packages(), # Project uses reStructuredText, so ensure that the docutils get
# installed or upgraded on the target machine
# install_requires=['docutils>=0.3'], package_data={
# If any package contains *.txt or *.rst files, include them:
'': ['*.txt', '*.otf', '*.ttc', '*.sh', '*.css', '*.js', '*.ttf', '*.eot', '*.svg', '*.woff'],
'perception': ['templates/*',
'blocks/econet/*.yaml',
'compiled/Makefile',
'compiled/center_net/_cpools/src/*.cpp', 'compiled/center_net/_nms/*.c',
'compiled/center_net/_nms//pointer/resnet50/*',
'modules/meter_recognition_v2/cfgs/*',
'modules/meter_recognition_v2/cfgs/resnet50/*',
],
'services': ['*.sh',
'lingxi/static/js/*.js', 'lingxi/static/audio/*.wav',
'lingxi/static/docs/*.pdf', 'lingxi/static/imgs/*.jpg',
'lingxi/static/*.html', 'lingxi/templates/*.html',
'lingxi/static/*.css', 'lingxi/static/*.ico']
}, # metadata to display on PyPI
author="",
author_email="",
maintainer="",
maintainer_email="{dzp, gy, xkk}@kilox.cn",
description="分析系统",
keywords="",
url="",
license="GPLv3",
platforms="UNIX",
long_description="README.md, CHANGELOG.md, LICENSE",
install_requires=['opencv-python', 'numpy', 'Pillow', 'six', 'torch', 'pytz', 'waitress', 'wtforms', 'flask',
'torchvision', 'termcolor', 'scipy', 'matplotlib', 'imageio', 'requests', 'soundfile', 'librosa',
'face_recognition', 'scikit-image', 'imutils', 'tensorflow', 'mmcv', 'pycocotools', 'tabulate',
'psutil', 'py-cpuinfo', 'PyYAML', 'fvcore']
)

用Setuptools构建和分发程序包的更多相关文章

  1. 全面学习 Python 包:包的构建与分发

    首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而 ...

  2. 【Azure DevOps系列】Azure DevOps构建并发布Nuget程序包

    在Azure DevOps中,管道可以用来构建解决方案,O(∩_∩)O哈哈~快万能了,本章主要介绍如何创建Nuget包并且将其发布到Nuget服务器的过程. 前面我创建了一个非常简单的类库,这边我不做 ...

  3. Spring-boot构建多模块依赖工程时,maven打包异常:程序包xxx不存在

    在qizhi项目改版的时候, 所有代码都迁移好了, 但是compile的时候报程序包*****不存在, 具体到某一个类就是: 找不到符号. 下面这篇文章是正解 http://hbxflihua.ite ...

  4. 想拥有自己的Python程序包,你只需15步

    来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...

  5. 使用Beetle简单构建聊天室程序

    之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...

  6. [译]基于Vue.js的10个最佳UI框架,用于构建移动应用程序

    原文查看10 Best Vue.js based UI Frameworks for Building Mobile Apps 如果您期待使用Vue.js构建移动应用程序,那么您可以选择许多可用的UI ...

  7. Linux程序包管理之rpm

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...

  8. Linux程序包管理之yum及源代码安装

    第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...

  9. Linux程序包管理.md

    rpm 简介 RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器.RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身 ...

随机推荐

  1. 蓝桥杯-2016CC-卡片换位

    卡片换位 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵.还有一个格子是空着的. 你可以把一张牌移动到相邻的空 ...

  2. cs231n spring 2017 lecture14 Reinforcement Learning

    (没太听明白,下次重新听) 1. 增强学习 有一个 Agent 和 Environment 交互.在 t 时刻,Agent 获知状态是 st,做出动作是 at:Environment 一方面给出 Re ...

  3. Shell 快速入门(十八):特殊符号的使用

    在 Shell 语言中,经常会看到中括号和括号组成的特殊标识,例如:[].[[]].(()).$(()).().这些符号经常使我们非常迷惑,弄清楚它们之间的作用和区别非常必要. 在开始之前,我们先来学 ...

  4. async包 ES6 async/await的区别

    最基本的async 包 ApCollection.find({}).toArray(function (err, aps) { var num = 0; async.whilst( function ...

  5. HTML5 file API加canvas实现图片前端JS压缩并上传

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  6. Windows XP系列全下载(均为MSDN原版)

    正版windows xp sp3 下载大全(附:正版密钥) 微软MSDN Windows XP Professional下载 Windows XP Professional 简体中文 (最原始版本,无 ...

  7. python Select\Poll\Epoll异步IO与事件驱动

    参考:http://www.cnblogs.com/alex3714/articles/5248247.html 写服务器处理模型的程序时通常采用的模型: (1)每收到一个请求,创建一个新的进程,来处 ...

  8. python 常用模块介绍

    1.定义 模块:用来从逻辑上组织python代码(变量.函数.类,逻辑),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test). 包:用来从逻辑上组织模块的,本质就是 ...

  9. [PyTorch入门]之数据导入与处理

    数据导入与处理 来自这里. 在解决任何机器学习问题时,都需要在处理数据上花费大量的努力.PyTorch提供了很多工具来简化数据加载,希望使代码更具可读性.在本教程中,我们将学习如何从繁琐的数据中加载. ...

  10. JavaScript学习之内存

    初学JavaScript时,看红皮书了解了JS基本类型和引用类型在内存中的位置,结果看了简书里的一篇文章,发现对这块的了解还是有些缺陷. 基本类型 JavaScript中的基本类型有五种:Undefi ...