Python3 通过TOML进行打包与上传到Pypi的踩坑日记

前期准备

1.需要先注册好pypi和testpypi的账号

image.png
image.png
image.png
image.png

image.png

image.png
image.png
下面的TestPypi的也是一样,他们的创建方法和使用方法都是一样的,只是一个是正式的环境,一个是给你的测试环境
需要注意⚠️的是:
写入文件的时候,内容区分好。一个是[pypi]一个是[testpypi]

2.安装构建和打包工具

pip3 install build # 构建包的工具 
pip3 install twine # 上传包的工具

编写配置文件

pyporject.toml

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "Sanic-Admin" # 项目名
version = "0.1" # 版本号
authors = [
  { name="A-Corner", email="a.corner.vj@gmail.com" },
] # 作者
description = "The Admin backend created by the combination of Sanic And Amis manages SANic-admin" # 说明
readme = "README.md" # pypi介绍内容会读取的readme文件
requires-python = ">=3.9" # 依赖
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: OS Independent",
]

[project.urls]
"Homepage" = "https://github.com/A-Corner/Sanic-Admin" # 源连接

MANIFEST.in

MANIFEST.in是Python项目中的一个文件,通常用于指定源分发包中应该包括哪些额外的文件或文件夹。它的格式是一系列命令和模式匹配规则,告诉setuptools在打包时包含或排除特定的文件和目录。
下面是MANIFEST.in文件中常用的命令和对应的含义:

  1. include pat1 pat2 …:打包时包含所有与任何一个模式匹配的文件,可以使用Unix shell-style通配符。
  2. exclude pat1 pat2 …:排除所有与任何一个模式匹配的文件。
  3. recursive-include dir pat1 pat2 …:递归地包含所有与任何一个模式匹配的文件,其中dir是相对于源代码目录的路径。
  4. recursive-exclude dir pat1 pat2 …:递归地排除所有与任何一个模式匹配的文件,其中dir是相对于源代码目录的路径。
  5. global-include pat1 pat2 …:在源树中包含与任何一个模式匹配的文件,无论其位置如何。
  6. global-exclude pat1 pat2 …:在源树中排除与任何一个模式匹配的文件,无论其位置如何。
  7. prune dir:排除dir目录及其子目录中的所有文件。
  8. graft dir:包含dir目录及其子目录中的所有文件。
include pyproject.toml

# Include the README
include *.md

# Include the license file
include LICENSE.txt


# Include the static file or data file
recursive-inculde src/Sanic-Admin/test *.*
recursive-include src/Sanic-Admin/admin *.*

在使用TOML格式的打包方式时,setup.py文件通常会使用tomlkit库来读取和解析pyproject.toml文件,并从中提取有关项目的信息。然后,根据这些信息生成setuptools.setup()函数需要的参数并调用它。
在这个过程中,MANIFEST.in文件被视为源代码目录的一部分,并且必须在构建过程的早期被处理。这是因为MANIFEST.in文件中指定了哪些文件应包含在打包中,而这些文件必须在安装或分发软件包之前已经存在于正确的位置。
因此,在构建时先执行MANIFEST.in文件,然后再读取pyproject.toml文件,并使用其中的信息来配置setuptools.setup()函数的参数。如果您的MANIFEST.in文件包括需要特殊处理的文件(例如数据文件或模板),则可以使用setup.py脚本的特殊函数(例如include_package_data)来确保它们被正确地包含在软件包中。

打包/上传

当你编写好配置文件,并且把你的包存放在src的目录下,就可以执行打包动作:
执行命令:

# 打包
python3 build
# 打包后就会创建dist的目录,你需要上传的包就在dist目录下
# 上传
python3 -m twine upload --repository testpypi dist/*

异常处理

像往常一样使用 twine upload 命令将 Python 项目上传到 PyPi 上,意外地遇到了 401 错误:
image.png

WARNING  Error during upload. Retry with the --verbose option for more details.
ERROR    HTTPError: 401 Unauthorized from https://upload.pypi.org/legacy/
         User fournoas has two factor auth enabled, an API Token or Trusted Publisher must be used to upload in place of password.

应该是 PyPi 调整了安全策略,不再允许启用两步验证的账号使用用户名密码来上传项目了,必须使用 API 令牌来进行身份验证。
登录 PyPi ,进入账户设置页,点击「添加 API 令牌」按钮创建 API 令牌。然后修改 ~/.pypirc 配置文件, 用户名字段改为 token ,密码字段改为刚才创建的令牌:
具体的需要去登录PYPI/TestPypi上去创建API Token
image.png
按照界面提示修改后在重试上传就可以了。
image.png
当你上传成功后,登录testpypi就可以看到你刚刚上传的包,然后点击查看
image.png
在查询详情页中,就有安装你的测试pypi的命令,可以复制后在command-line下创建一个新的虚拟环境,执行安装测试下
image.png
安装你在test-Pypi上的包进行测试

pip3 install -i https://test.pypi.org/simple/ Sanic-Admin

如果没有问题,就重新上传到pypi中。这次可以不指定上传的源地址。

坑点

静态和数据文件

如果你有静态文件,必须要在MANIFEST.in中使用 recursive-include dir pat1 pat2 来包含进去,如果不递归包含,打包的时候不会进行纳管的。

项目子目录

如果你还有项目子目录,在子目录中都必须要有__init__.py文件,除非你在MANFIEST.ininclude 了整个子目录的所有文件,要不就必须有__init__.py文件,如果没有,打包进程不会对包进行纳管。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ViniJack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值