python pip 打包指南

2023-05-16

一个成功的开源项目的其核心功能是打包功能,而出色的打包功能的关键在于版本控制。因为项目是开源的,所以您希望发布的包能够体现出开源社区所具备的优点。不同的平台与语言具有不同的打包机制,本文主要讲述的是 Python 及其打包机制。本文所讨论的打包机制可以作为您的基础学习,此外还提供了大量的实例,可让您快速起步。

关注打包的理由

除了正确做法这条理由之外,打包软件还有三条实际的理由:

  • 易用性
  • 稳定性(带有版本控制)
  • 发布

尽量减少用户安装您的应用程序的工作量是值得的。打包会让您的软件变得更容易访问和安装。如果其安装流程更加简便,用户就会更加愿意使用您的软件。如果在 Python Package Index (PyPI) 上发布您的包,那么就可以通过像 pip 或 easy_install 这样的实用工具轻易地对其进行访问。请参见 参考资料 中的链接,以了解关于这些工具的更多信息。

另外,通过对包进行版本控制,可以指定用户的项目依赖于某一个特定版本。例如,将 Pinax 指定为 0.9a2.dev1017 版本,表达如下:


Pinax==0.9a2.dev1017  

这样就会强制项目使用 0.9a2.dev1017 版本的 Pinax。

如果您稍后发布可能破坏接口的软件变更,版本控制会保证更好的稳定性。它允许用户确切地了解他们获得了什么,并使跟踪版本之间差异的工作变得更加轻松。此外,项目开发人员可以确切地知道他们正在基于什么进行编码。

将包发布到 PyPI(或者您自己的发布服务器)上的一种常用方法是创建一个源发布并上传。源发布是将项目源代码打包为一个可发布单元的一种标准方式。创建二进制发布有多种途径,但是为了开源,发布源代码也合乎情理。创建源发布可充许人们能够轻易地使用工具,在 Internet 上查找和下载软件并执行全自动软件安装。此过程不仅有助于本地开发,而且对软件的部署也有助益。

因此,通过让用户能够更加轻松地集成与安装您的软件,使用支持可靠固定技术的优秀版本控制,并发布您的包以实现更好的分布,您项目取得成功并获得广泛采用的机会就将大增。更广泛的采用意味着更多的参与者,这想必是每一位开源开发人员的希望。

回页首

setup.py 文件的剖析

setup.py 脚本的用途之一是充当可执行文件,您可以运行它来打包软件并将其上传到发布服务器上。当您浏览流行的 Python 库时,setup.py 脚本的内容可能存在相当大的差异。本文主要关注于基础知识。如想进一步了解,请参见 参考资料 部分的内容。

setup.py 文件有多种用途,但在这里创建它的目的是运行以下命令:


python setup.py register
python setup.py sdist upload  

第一个命令 register 使用 setup.py 脚本中 setup() 函数提供的信息,并为您的包在 PyPI 上创建了一个入口。它不会上传任何内容,相反它会创建关于项目的元数据,以便您能够随后上传与保存版本。接下来的两个命令是串连在一起使用的:sdist upload 构造了一个源发布,然后将它上传到 PyPI。但是有一些先决条件,比如要设置您的 .pypirc 配置文件并实际写入 setup.py 的内容。

首先配置 .pypirc 文件,该文件应该位于您的主目录(根据操作系统的不同而有所变化)中。在 UNIX®、Linux® 与 Mac OS X 上,输入 cd ~/即可访问该目录。该文件的内容应该包含您的 PyPI 证书,如 清单 1 中所示。

清单 1. 典型的 .pypirc 文件

[distutils]
index-servers =
    pypi

[pypi]
username:xxxxxxxxxxxxx
password:xxxxxxxxxxxxx  

接下来,访问 PyPI 并注册一个账号(不用担心,它是免费的)。将您在 PyPI 上创建的用户名与密码放入 .pypirc 文件中,并确保文件名为~/.pypirc。

在编写 setup.py 脚本时,您必须决定要在 PyPI 索引页面上显示什么内容,以及您想给项目取什么名称。从复制我对项目使用的 setup.py 模板开始(参见清单 2)。跳过导入与函数,查看模板末端,看看需要修改什么地方来适应您的项目。请参见 参考资料 中关于完整脚本的链接。

清单 2. setup.py 模板

PACKAGE = ""
NAME = ""
DESCRIPTION = ""
AUTHOR = ""
AUTHOR_EMAIL = ""
URL = ""
VERSION = __import__(PACKAGE).__version__

setup(
    name=NAME,
    version=VERSION,
    description=DESCRIPTION,
    long_description=read("README.rst"),
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,
    license="BSD",
    url=URL,
    packages=find_packages(exclude=["tests.*", "tests"]),
    package_data=find_package_data(
			PACKAGE,
			only_in_packages=False
	  ),
    classifiers=[
        "Development Status :: 3 - Alpha",
        "Environment :: Web Environment",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: BSD License",
        "Operating System :: OS Independent",
        "Programming Language :: Python",
        "Framework :: Django",
    ],
    zip_safe=False,
)  

首先要注意,这个模板希望您的项目具有两个不同文件。第一个文件用于 long_description,它读取与 setup.py 位于同一目录中的 README.rst 文件的内容,并将内容以字符串形式传递给 long_description 参数。此文件用于填充 PyPI 上的登录页面,因此在文件中简要描述项目并显示一些使用实例是个好主意。第二个文件是包的 __init__.py 文件。这里并没有明确提及它,但设置 VERSION 变量的行用于导入了您的包。而当执行此项操作时,Python 还需要一个 __init__.py 文件和一个在该模块中定义的名为 __version__ 的变量。就目前而言,只要将它设置为一个字符串即可:


# __init__.py
__version__ = "0.1"  

现在,让我们看一看其余的输入:

  • PACKAGE 是您项目中的 Python 包。它是顶级文件夹,其中包含应该与 setup.py 文件位于相同目录中的 __init__.py 模块,例如:
    
    /-
      |- README.rst
      |- setup.py
      |- dogs 
         |- __init__.py
         |- catcher.py  

    因此,这里的 dogs 就是您的包。

  • NAME 一般类似或等同于您的 PACKAGE 名称,但可以是您希望的任何内容。NAME 就是人们引用您的软件时使用的名称,这个软件名称将会列在 PyPI 中,而且更重要的是,用户将使用这个名称来安装软件(例如,pip 安装 NAME)。
  • DESCRIPTION 只是对您的项目的一段简要描述,一句话便已足够。
  • AUTHOR 与 AUTHOR_EMAIL 正如它们字面上的意思:您的姓名和电子邮件地址。这些信息是可选的,但提供电子邮件地址是比较实际的做法,因为人们可能希望与您取得联系。
  • URL 是项目的 URL。这个 URL 可能是一个项目网站、Github 库或您希望的任意 URL。再次强调,这些信息是可选的。

您可能还希望提供许可证与分类。了解有关创建一个 setup.py 文件的更多信息,请参考 Python 文档。请参见 参考资料)。

回页首

版本控制

版本控制本身就是一个很大的主题,但在打包时不得不提到它,因为优秀的打包需要正确的版本控制。 版本控制是您与用户进行某种形式的沟通:它也允许用户在其产品中实现更好的稳定性与可靠性。通过版本控制,您可以告诉用户您修改了哪些内容,并为这些修改出现的位置设定明显的界限。

在 Python Enhancement Proposal (PEP) 386 中可以找到对 Python 包进行版本控制的一种标准(请参见 参考资料)。它给出了一些实用的规则。即使您没有阅读和理解或者甚至是赞同 PEP,最好也按照它来行事,因为越来越多的 Python 开发人员已经习惯于这样做。

另外,版本控制不仅用于您上传到 PyPI 上的稳定版本,而且还用于使用 devNN 后缀的开发版本。将这些开发版本上传到 PyPI 上通常不太好,但您可以通过设置自己公共的(或私有的)发布服务器,让它们变为可公共访问的。然后,想使用最新版本的用户就可以在他们的 pip 需求 .txt 文件中进行引用。下面给出了版本控制的一些例子:


1.0.1        # 1.0.1 final release
1.0.2a       # 1.0.2 Alpha (for Alpha, after Dev releases)
1.0.2a.dev5  # 1.0.2 Alpha, Dev release #5  

回页首

发布

如果没有发布,人们一般无法找到和安装您的软件。大多数时候,您需要把自己的包发布到 PyPI 上。在设置 .pypirc 配置文件之后,您传递给 setup.py 的 upload 命令将把您的包传输给 PyPI。通常,您在这样做的同时还会构建一个源发布:


python setup.py sdist upload  

如果您使用的是自己的发布服务器,而且 .pypirc 文件中的授权部分也包含了这个新位置,只要在上传时引用它的名称即可:


python setup.py sdist upload -r mydist  

回页首

搭建您自己的发布服务器

在开源环境中使用自己的发布服务器的主要原因是提供一个发布开发版本的位置,因为 PyPI 实际上只应该包含稳定的版本。例如,您很可能想使用如下命令:


pip install MyPackage  

安装从 PyPI 上发现的最新稳定版本。然而,如果您添加后来的开发版本,该命令会结束最新版本的安装,也就是您的开发版本。固定版本始终是正确的做法,但并非所有的用户都能坚持这么做。因此,确保在指定版本号时总是返回最新的稳定版本。

一种两全其美的方法(只对 pip 的默认用法公开稳定的版本,同时允许用户安装打包的开发版本)是使用自己的发布服务器。Pinax 项目为它所有的开发版本都做了这项工作,网址是 http://dist.pinaxproject.com(参见 参考资料)。

发布服务器只是一个索引,基于 Hypertext Transfer Protocol (HTTP) 协议为服务器上的文件提供服务。它的文件结构应该如下:


/index-name/package-name/package-name-version.tar.gz  

通过在 Web 服务器上配置 Basic-Auth,您可以将服务器变为私有。您可能还想添加一些工具来上传源发布。为此,需要添加代码来处理上传,解析文件名,以及创建与上述模式相匹配的目录路径。这种结构在 Pinax 项目中已经开始应用,该项目拥有几个库。

回页首

pip 与 virtualenv

尽管本文的讲述重点是打包,这部分内容描述了如何使用包,以及优秀的打包与版本控制为用户能够带来的好处。

pip 是可以直接安装的工具,但我建议使用它作为 virtualenv 的一部分(参见 参考资料)。我建议对与 Python 相关的所有内容均使用virtualenv,因为它可以保持 Python 环境的干净。正如一台虚拟机允许同时运行多个操作系统一样,virtualenv 也支持您同时运行多个 Python 环境。我没有在我的系统 Python 中安装任何内容,而是为我使用的每个新项目或实用工具都创建了一个新的 virtualenv

安装 virtualenv 后,立即就可以使用:


$ mkvirtualenv —no-site-packages testing
$ pip install Pinax
$ pip freeze|grep Pinax
$ pip uninstall Pinax
$ pip install —extra-index-url=http://dist.pinaxproject.com/fresh-start/ 
    Pinax==0.9a2.dev1017
$ pip freeze|grep Pinax  

注意,第一个 pip 安装是从 PyPI 下载和安装的。pip freeze 可以显示当前 virtualenv 中已安装的所有包版本。pip uninstall 的用途与您猜想的完全一样:将它自己从 virtualenv 中删除。接下来,您要在全新的库中安装一个开发版本,地址是 http://dist.pinaxproject.com,以便获取 Pinax 0.9a2.dev1017 版的开发版本。

无需访问网站,下载 tarball,并将代码与网站包建立符号链接(这是我通常的做法,会引发很多问题)。用户只有在项目中实现优秀的打包、发布与版本控制,才能做到这一切。

回页首

结束语

总的说来,您花费一些时间来学习打包的艺术与科学是值得的。由于对包进行版本控制会带来易安装性和稳定性,所以您的软件会被更多用户采用。使用 参考资料 和本文所提供的模板 setup.py,您可以快速而方便地给项目增加打包功能。通过正确的版本控制与用户沟通,站在用户的角度去考虑,可以让他们更容易跟踪版本之间的变化。最后,由于 pip 与 virtualenv 赢得了更为广泛的采用,对发布包的依赖(位于 PyPI 或您自己的发布服务器上)越来越大。因此,一定要发布你想要与全世界分享的项目。

我希望本文为您提供了足够多的基础知识。参考资料 将提供更多相关文档以供您进行进一步的了解。如有疑问,请到 Freenode、聊天室 #pinax and #django-social(我昵称叫 “paltman”)或 Twitter 上与我交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python pip 打包指南 的相关文章

  • 通过 boto3 承担 IAM 用户角色时访问被拒绝

    Issue 我有一个 IAM 用户和一个 IAM 角色 我正在尝试将 IAM 用户配置为有权使用 STS 承担 IAM 角色 我不确定为什么收到 访问被拒绝 错误 Details IAM 角色 arn aws iam 123456789 r
  • Flask中使用的路由装饰器是如何工作的

    我熟悉 Python 装饰器的基础知识 但是我不明白这个用于 Flask 路由的特定装饰器是如何工作的 以下是 Flask 网站上的代码片段 from flask import Flask escape request app Flask
  • 使用 pandas.date_range() 生成多个日期时间,每周两个日期

    我在用着pd date range start date end date freq W MON 每周一生成每周频率日期时间start date 2017 01 01 and end date 2017 12 31 这意味着每月大约生成 4
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 将 yerr/xerr 绘制为阴影区域而不是误差线

    在 matplotlib 中 如何将误差绘制为阴影区域而不是误差条 例如 而不是 忽略示例图中各点之间的平滑插值 这需要进行一些手动插值 或者只是获得更高分辨率的数据 您可以使用pyplot fill between https matpl
  • 如何删除 PyCharm 中的项目?

    如果我关闭一个项目 然后删除该项目文件夹 则在 PyCharm 重新启动后 会再次创建一个空的项目文件夹 只需按顺序执行以下步骤即可 他们假设您当前在 PyCharm 窗口中打开了该项目 单击 文件 gt 关闭项目 关闭项目 在 PyCha
  • 从字典的元素创建 Pandas 数据框

    我正在尝试从字典创建一个 pandas 数据框 字典设置为 nvalues y1 1 2 3 4 y2 5 6 7 8 y3 a b c d 我希望数据框仅包含 y1 and y2 到目前为止我可以使用 df pd DataFrame fr
  • Python re无限执行

    我正在尝试执行这段代码 import re pattern r w w s re compiled re compile pattern results re compiled search COPRO HORIZON 2000 HOR p
  • 将 C++ 指针作为参数传递给 Cython 函数

    cdef extern from Foo h cdef cppclass Bar pass cdef class PyClass cdef Bar bar def cinit self Bar b bar b 这总是会给我类似的东西 Can
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • 更改QLineEdit的ClearButton图标

    我想在Windows 10 1909 64位 上的Python 3 8和PyQt5 5 15 0 上更改我的QLineEdit的ClearButton图标 稍后我想在Linux上运行代码 我尝试应用此处找到的代码 如何在 QLineEdit
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • 为什么这个 if 语句会导致语法错误

    我正在尝试设置一个 elif 语句 如果用户按下 Enter 键 代码将继续 但是我不断遇到语法错误 GTIN 0 while True try GTIN int input input your gtin 8 number if len
  • App Engine 实体到字典

    将 google app engine 实体 在 python 中 复制到字典对象的好方法是什么 我正在使用 db Expando 对象 所有属性均为扩展属性 Thanks 有一个名为foo尝试 foo dict
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • Discord.py 嵌入中禁用按钮/冻结按钮

    I m trying to make a replica of this bot in which when I press any of the buttons below it shows a dropdown menu and you
  • numpy polyfit 中使用的权重值是多少以及拟合误差是多少

    我正在尝试对 numpy 中的某些数据进行线性拟合 Ex 其中 w 是该值的样本数 即对于点 x 0 y 0 我只有 1 个测量值 该测量值是2 2 但对于这一点 1 1 我有 2 个测量值 值为3 5 x np array 0 1 2 3
  • 仅允许正小数

    在我的 Django 模型中 我创建了一个如下所示的小数字段 price models DecimalField u Price decimal places 2 max digits 12 显然 价格为负或零是没有意义的 有没有办法将小数
  • 高效创建抗锯齿圆形蒙版

    我正在尝试创建抗锯齿 加权而不是布尔 圆形掩模 以制作用于卷积的圆形内核 radius 3 no of pixels to be 1 on either side of the center pixel shall be decimal a

随机推荐

  • python爬虫学习:tesseract之实现图片里文字的识别

    目录 1 Tesseract基础1 1 Tesseract简介1 2 Tesseract安装1 3 Tesseract使用1 4 下载语言库 2 Tesseract在Python中的使用 1 Tesseract基础 1 1 Tesserac
  • VS2015 error MSB8020: The build tools for xxx

    问题 VS2015 error MSB8020 The build tools for xxx 问题截图 xff1a 解决方案 xff1a 平台工具集版本不正确 xff0c 更正一下即可 解决方案右键项目属性 gt gt 配置属性 gt g
  • FFmpeg 视频编码--------把 .rgb 变成 .mp4

    FFmpeg 视频编码 一 什么是视频编码 xff1f 视频编码的主要作用是将视频像素数据 xff08 RGB xff0c YUV等 xff09 压缩成为视频码流 xff0c 从而降低视频的数据量 如果视频不经过压缩编码的话 xff0c 体
  • ubuntu设置代理 的三种方式

    转载自 xff1a http www cnblogs com lexus archive 2012 02 20 2359229 html ubuntu下设置代理 2010 01 11 20 13 20 分类 xff1a ubuntu总结 标
  • win10 + WDK10+ VS2015 + vmware_win10 驱动开发环境配置

    自从WDK8 1后 xff0c 开发window 驱动不用再用windbg 43 虚拟机调试了 xff0c 我们调试驱动也可以像调试EXE 一样方便 xff0c 下面是win10 主机 43 WDK10 43 VS2015 43 vmwar
  • VS Code搭建PyQt5开发环境

    前言 二 PyQt5相关模块下载 1 利用Python的pip安装PyQt5和PyQt5 tools扩展包 2 VS code中安装PyQt Integration和Qt for Python 3 VS code中配置Qt designer
  • 解密微信电脑版image文件夹下缓存的用户图片

    我们的微信体积越来越大 xff0c 该怎样查看 xff1f 该怎样为其减肥哪 xff1f 重点来了 在微信缓存中 FileStorage 文件夹时发现了其目录下的 Image 文件夹 xff0c 可能是使用过程中缓存的聊天图片等 xff0c
  • 怎么寻找微信撤回的图片

    1 回顾 自从发布文章 寻找微信撤回的图片 之后 xff0c 骗了不少粉啊 总之 xff0c 之前提出了一种可以找到微信撤回图片的方法 2 真相 之前的说法是 xff0c 工程师并没有真正把撤回的图片删除 xff0c 而是加密后藏起来了 其
  • 电脑端微信文件的存储位置在哪?

    在微信聊天中会产生很多文件 xff0c 首先微信的文件存放位置 xff1a 默认情况下 c users administrator document wechat files xxx 以下所有文件截图都是从这个父级目录开始的 示例图 Bac
  • 微信的dat文件正确打开方式及问题处理

    微信的dat文件是微信用于缓存PC端微信的图片 xff0c 然后对图片进行了加密的处理 所以是可以删除的 xff0c 有些朋友data文件夹下有十几G的 xff0c 都是可以删除的 xff0c 但是最好确保这些文件都已经没有用处了再进行删除
  • 微信中的dat文件到底是什么

    微信dat文件是表示电脑上微信聊天记录数据文件 xff0c 可以选择删除 虽然删除这些文件并不会影响微信的正常使用 xff0c 但是如果需保留电脑端微信的聊天记录 xff0c 重要的材料则不要删除 微信 xff08 WeChat xff09
  • 2022年2月11日

    P3375 模板 KMP字符串匹配 题目描述 给出两个字符串 s 1s1 和 s 2s2 xff0c 若 s 1s1 的区间 l r l r 子串与 s 2s2 完全相同 xff0c 则称 s 2s2 在 s 1s1 中出现了 xff0c
  • 网易云音乐NCM格式转化为mp3

    前段时间帮朋友下歌放在车上听 结果好多都是ncm格式 xff0c 伤心 xff0c 搜索了下发现基本上这格式解密有好多昂 xff0c 可惜UI我都不太想要 决定抄一下 xff0c 自己做一个 这里先记录下核心代码 xff0c 回头补充个UI
  • 旧电脑怎么升级到新版Win10

    Windows 10 2020年5月更新是最新版的win10系统 xff0c 相比以往的win10有了许多的改进 xff0c 比如说新的Cortana应用 云端重置以及Linux 2的Windows子系统等等 而Windows搜索的改进 x
  • K12教育小初高各个版本教材内的章节数据

    一个 相对 权威的资源网站 xff0c 然后把这个网站上的所有章节 教材全部爬下来 xff0c 进行保存数据库 xff0c 用于我们后续教学方面的基础数据 先说下结果 xff1a 算上小学 初中 高中三个学段 xff0c 所有学科下共计51
  • 1-FreeSwitch-CentOS7安装freeswitch1.10.2

    文章目录 一 前言二 安装2 1 安装 96 96 96 noarch 96 96 96 2 2 96 96 96 处理安装源 96 96 96 2 3 安装 96 96 96 cmake 96 96 96 2 4 安装 96 96 96
  • 「Python语法结构」输出语句示例(1)

    打印 玩具列表 字符串 功能要求 在屏幕上打印出 玩具列表 这样 实例代码 print 39 玩具列表 39 print 34 玩具列表 34 print 39 39 39 玩具列表 39 39 39 print 34 34 34 玩具列表
  • wsl导致vmmem占用高解决办法

    自从装了wsl我这个年迈的电脑就更加吃力 xff0c 尤其是内存基本上都要占到90 以上 xff0c 打开任务管理器一看内存一半以上都是被vmmem吃掉了 xff0c 于是在网上寻找解决办法 xff0c 并记录优化过程 文章目录 定期执行缓
  • wsl配置java环境以及使用vscode调试

    记录如何在wsl中配置java编译环境 xff0c 以及如何使用vscode进行编译调试 文章目录 下载jdk下载maven配置环境变量使用vscode调试java 下载jdk 点击进入到oracle jdk的下载页面 选择合适的安装包 解
  • python pip 打包指南

    一个成功的开源项目的其核心功能是打包功能 xff0c 而出色的打包功能的关键在于版本控制 因为项目是开源的 xff0c 所以您希望发布的包能够体现出开源社区所具备的优点 不同的平台与语言具有不同的打包机制 xff0c 本文主要讲述的是 Py