百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

2021年,你应该知道的Python打包指南

off999 2024-09-16 00:52 64 浏览 0 评论

△点击上方Python猫”关注 ,回复“1”领取电子书

花下猫语:好久没在开头写推荐语了。今天分享一篇文章,作者应该是国内唯一一位PyPA成员。如他所言,中文世界关于 Python 最新包管理发展的内容确实很少,因此他的这篇文章有很好的指导价值。恰好我之前曾翻译过PyPA维护者的三篇文章(这里),算是有一定的相关性,推荐大家作关联阅读。

作者:frostming

原题:Python打包指南2021

来源:https://frostming.com/2020/12-25/python-packaging

大家好,雕虫小技栏目又和大家见面了,谁让咱不会那些个屠龙之技,只好捉几个虫子玩玩了。写这篇文章是因为过去的两年关于pip和 Python 包管理有几个重要的 PEP 发布,然而网上(中文世界)的打包发布教程很少有针对此的更新。再加上我成为 PyPA 的成员已经尸位素餐快一年了,还是应该来做点贡献。

setup.py 真难写

似乎从有 Python 打包以来就有了setuptools这个库,你能搜到的教程,涉及打包发布的,都会让你编写那个可怕的setup.py。不知道谁能完全掌握那个东西的写法,我到现在都还不太会。说几个常用的配置:

  1. 指定依赖和可选依赖setup(
    install_requires=[
    "flask", "flask-migrate", "sqlalchemy"],
    extras_require={
    "mysql": ["mysqlclient"], "pgsql": ["psycopg2"]}
    )
    注意那两个 key 分别是install_requiresextras_require,别写错了。此外,如果你需要根据条件增减依赖的话,不要用INSTALL_REQUIRES = ["flask"]
    if sys.platform ==
    "win32":
    INSTALL_REQUIRES.append(
    "pywin32")
    setup(install_requires=INSTALL_REQUIRES)
    而应该使用Environment MarkersINSTALL_REQUIRES = [
    "flask",
    "pywin32; sys_platform == 'win32'"
    ]
    setup(install_requires=INSTALL_REQUIRES)
  2. 发布可执行程序到/binsetup(
    entry_points={
    "console_scripts": ["mybin=mypackage.main:cli"]
    }
    )
    或者 ini 写法setup(
    entry_points=
    """[console_scripts]
    mybin = mypackage.main:cli
    """

    )
    任选其一。
  3. 包含 data 文件setup(
    include_package_data=
    True # 从MANIFEST.in中读取配置
    )
    或者setup(
    package_data={
    "": ["*.json"]} # 包含所有json文件
    )
  4. 指定源代码结构,如果你使用的是src/存放包的源码这种项目结构,可以:setup(
    package_dir={
    "": "src"}
    )

打包上传和安装

打包

好了,这个万恶的setup.py我已经写好了,咱要发布 PyPI 了。第一步,打包成可分发的文件:

nbsp;python setup.py sdist bdist_wheel --universal

这条命令会同时生成源代码包(Source Distribution),和二进制包(Binary Distribution)。当然,大部分的 Python 发布包中并不真的包含二进制, 只是沿用了软件工程中的一般叫法。

其中bdist_wheel生成的二进制包是 wheel 格式(需要安装wheel才能打包),--universal的意思是这个二进制包对所有 支持的 Python 版本和 ABI 都适用,「 一处打包,到处使用」,生成的文件名类似:my_package-0.1.0-py3-none-any.whl

如果你包中有 C 扩展, 也就是打包出来的 wheel 会真的有二进制文件时就不能加这个 flag 了,这时生成的文件名类似:my_package-0.1.0-cp38-cp38-win_amd64.whl

这个文件名不是乱来的,是要遵循一定规则,下载器能直接从这个文件名获得这个包的基本信息:

上传

可能有老的教程,让你直接用python setup.py sdist bdist_wheel register upload打包上传一步到位,这个方式已经过时了不推荐使用。正确的方法应该用twine工具:

nbsp;twine upload dist/*

如果你要把上传放到 CI 里自动执行,最好生成一个 token 来使用,访问 https://pypi.org/manage/account/token/ 按提示生成一个 token,使用的时候只要用命令指定下用户名和密码:

twine upload --username __token__ --password ${{ secrets.PYPI_TOKEN }} dist/*

安装

把包上传到 PyPI 以后,pip install my-package的时候是怎么安装的呢?

  1. 访问https://pypi.org/simple/my-package,解析所有链接
  2. 若是 whl 文件,判断是否与当前 Python 版本、ABI、平台适配,加入到候选列表
  3. 从<a>标签中读取data-requires-python属性,判断是否与当前 Python 版本兼容,加入候选列表
  4. 若是源代码包,直接加入候选列表

最终在候选列表中优先选择 whl 文件为待安装的包,将包下载到本地,候选包的选择可以由pip install--only-binary--no-binary选项控制。

现在准备安装了,如果待安装的是 whl,那就非常简单,直接解压(whl 文件是一种 zip 格式),放到目标目录即可,解压后产生的文件除了代码或二进制以外,还会包含一个my_package-0.1.0.dist-info/目录,包含这个包的元数据信息,比如有哪些文件、文件 hash 值、entry_points 等等。

如果待安装的文件是源代码包,那么需要把这个压缩包解压到一个临时目录,根据包指定的方式编译构建,生成 whl 文件,再用 whl 安装同样的方法放到目标目录中。而这个指定的编译方式,在 PEP 517 提案之前,是调用python setup.py install命令。在 PEP 517 发布之后,则由 PEP 517 的 build backend 控制。

setuptools 不再是唯一的选择

PEP 517 的内容简单来说,就是在项目根目录下的pyproject.toml定义了两个特殊属性(注:其实还有第三个属性backend-path,当你的 backend 是在本地时使用。):

[build-system]
requires = ["setuptools >= 40.8.0", "wheel"]
build-backend = "setuptools.build_meta:__legacy__"

上面这个就是setuptools的 PEP 517 的配置,这样可以让老的项目,能直接用 PEP 517 的方式构建。如果你的项目中并没有pyproject.toml文件,pip能自动填充为此缺省配置。其中requires意为这个 backend 依赖的包列表,build-backend则为 backend 的具体位置。这个 backend 需要实现几个约定的接口:

  1. get_requires_for_build_wheel,构建 wheel 需要的依赖列表,这个一般没有特殊要求都是空
  2. get_requires_for_build_sdist,构建 sdist 需要的依赖列表,同上
  3. prepare_metadata_for_build_wheel,生成一个 wheel 要用的dist-info/文件夹
  4. build_wheel,生成 wheel 文件
  5. build_sdist,生成 sdist 文件

有了这些接口,pip以及其他可能的 frontend 就能从源代码构建一个 wheel 出来。因此,pyproject.toml必须被包含在源代码包中。

有了 PEP 517 的协议规范以后,backend 和 frontend 就能自由组合,不再是非setuptools不可了,实现了 PEP 517 的 backend 有:

  • Poetry-core
  • Flit-core
  • pdm-pep517
  • 所以我可以不用写 setup.py 了

    setup.py作为一个元数据的定义格式是有问题的:

    1. 必须由 Python 运行,无法静态解析
    2. 由于第 1 点,有注入恶意代码的操作可行性

    所以需要指定一个元数据的配置格式,这个格式规范最近也定下来了,它就是 PEP 621,也是使用pyproject.toml来定义的。而且,PDM已经支持这个配置格式了,仅此一家。


    阅读链接

  • Python Packaging User Guide (https://packaging.python.org/)
  • setuptools 文档 (https://setuptools.readthedocs.io/en/latest/)
  • Python 包构建接口 - PEP 517
  • Wheel 包格式 - PEP 427
  • Python 包元数据格式 - PEP 621
  • Snake bites: Beware malicious Python libraries (https://www.infoworld.com/article/3487701/snake-bites-beware-malicious-python-libraries.html)
  • 相关推荐

    mp3转mp4格式转换器(mp3转换成mp4格式的手机软件)
    mp3转mp4格式转换器(mp3转换成mp4格式的手机软件)

    下载格式工厂,打开格式工厂,点音频,选择MP3,点右上角添加文件,选择要转换的MP4文件,点确定就可以了。...

    2026-02-03 11:51 off999

    lol盒子官方下载(英雄联盟盒子官方)

    Wegame英雄联盟箱也叫LOL盒子,但现在LOL盒子已经被删除了,但是你可以放现在的盒子Wegame它被理解为英雄联盟指定插件,因为它还具有查看召唤师记录和记录各种数据、水晶复活、野生怪...

    上的视频直播下载(下载现场直播视频)
    • 上的视频直播下载(下载现场直播视频)
    • 上的视频直播下载(下载现场直播视频)
    • 上的视频直播下载(下载现场直播视频)
    • 上的视频直播下载(下载现场直播视频)
    微信2025最新版本官方免费下载

    是的,苹果6可以继续使用微信。虽然苹果6已经不再是最新的iPhone型号,但它仍然能够支持微信的运行。只要你的苹果6上安装了最新版本的iOS系统,你就可以在上面下载和使用微信应用程序,与朋友们聊天、分...

    谷歌翻译软件免费下载(谷歌翻译官方免费版)
    • 谷歌翻译软件免费下载(谷歌翻译官方免费版)
    • 谷歌翻译软件免费下载(谷歌翻译官方免费版)
    • 谷歌翻译软件免费下载(谷歌翻译官方免费版)
    • 谷歌翻译软件免费下载(谷歌翻译官方免费版)
    在线音乐(在线音乐合集)

    在线听音乐就是利智能手机或者电脑,其中的应用上的资源,不下载随搜随播放收听,这样的听音乐方便快捷,但是音质一般,因为手机和电脑都是软解,若是想要得到无损音质,则把曲目下载后导出手机或者电脑外,使用储卡...

    滴滴注册司机车辆要求(滴滴注册司机车辆要求营运证)

    以北海市为例,车辆要求如下:根据《北海市网约车管理实施细则》第十三条拟从事网约车经营的车辆,应当符合以下条件(一)七座及以下乘用车;(二)网约车经营车辆尾气排放必须达到国家规定的环保标准,发动机排量...

    植物大战僵尸单机下载(单机植物大战僵尸免费版手机版)

    您好,要在手机上下载并玩植物大战僵尸无尽版(Plantsvs.ZombiesEndlessVersion),可以按照以下步骤操作:1.打开手机的应用商店(如AppStore或Google...

    赚钱app第一名(赚钱app第一名提现微信)
    赚钱app第一名(赚钱app第一名提现微信)

    比较大的公司产品就有:抖音极速版和今日头条极速版,欢迎扫码注册,注册后可以做任务赚金币,金币可以还钱,还可以提现;其他还有一些各种app,什么走路赚钱,读书赚钱等等的,不过不建议安装。头条、西瓜、抖音、快手等等都很靠谱啊,赚钱只能各凭本事了...

    2026-02-03 09:51 off999

    新东方英语线上课程报名(适合小学生免费学英语的软件)

    新东方网上报名及支付操作流程一、登陆http://sz.xdf.cn/,进入新东方官网首页,搜索课程名称或者班号,选择适合您的课程二、进入搜课课程页面,点击【立即报名】三、去结算已选在购物车的课程四、...

    应用宝一键安装(应用宝一键安装小米)
    • 应用宝一键安装(应用宝一键安装小米)
    • 应用宝一键安装(应用宝一键安装小米)
    • 应用宝一键安装(应用宝一键安装小米)
    • 应用宝一键安装(应用宝一键安装小米)
    沫子漫画画免费读漫画在线观看

    漫画结局就是夏沫和大少爷结婚,洛熙就在教堂听了什么后释然了,夏末还怀上了欧辰的宝宝,并且获得了最佳女主角的奖项。据文中洛熙的说法,是在第一次参加超级明星的那天晚上,在漫画第四话第28页,不过漫画上画的...

    主题壁纸大全下载(好看的主题壁纸图片)

    主题和壁纸有很大的区别,壁纸的话,你可以根据自己的喜好来设置你想要得到的壁纸,可以从你的相册里面挑选壁纸作为你的手机屏幕壁纸纸,但是主题的话,主题,他是属于一个系列的,当你换了手机主题之后,你的操作界...

    网络电视下载什么软件看直播电视

    1,饭团影视tv版  饭团影视是一款超好看的影视资源播放器软件轻松享受追剧的快感,无卡顿流畅播放,超强大的播放功能。  2,红影TV版  红影TV是一款电视点播软件,无需授权码,无需注册登录,软件完全...

    如何快速学会cad制图(怎样能快速学会cad画图)

    CAD可以自学啊,很简单,就是你报个班去学也就是那些简单点的东西,自学都可以搞定的,因为那些辅导班很少有教你实际的东西,大都是一些简单命令的操作。。。CAD也分好几种,机械,电气,建筑等等,你的先选好...

    取消回复欢迎 发表评论: