当前位置:   article > 正文

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

toml setuptools

前期准备

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 # 上传包的工具
  • 1
  • 2

编写配置文件

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" # 源连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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 *.*
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在使用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/*
  • 1
  • 2
  • 3
  • 4
  • 5

异常处理

像往常一样使用 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.
  • 1
  • 2
  • 3

应该是 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
  • 1

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

坑点

静态和数据文件

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

项目子目录

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/505886
推荐阅读
相关标签
  

闽ICP备14008679号