当前位置: 首页 > news >正文

使用 uv 发布 Python 包到 PyPI 教程

本教程将指导你使用 uv 工具创建一个 Python 包并将其发布到 PyPI。uv 是一个快速、现代的 Python 包管理工具,适合替代传统的 pipsetuptools

前提条件

  1. 安装 Python(建议 3.8 或以上版本)。
  2. 安装 uv
    pip install uv
    
  3. 拥有一个 PyPI 账户(在 PyPI.org 注册)。
  4. (可选)如果你需要发布到 TestPyPI,可以在 test.pypi.org 注册。

步骤 1:创建项目结构

  1. 创建一个新目录作为你的项目根目录:

    mkdir my-python-package
    cd my-python-package
    
  2. 初始化项目:

    uv init
    

    uv init 会生成一个基本的项目结构,包含以下文件:

    • pyproject.toml:项目的元数据和依赖配置文件。
    • src/my_python_package/__init__.py:包的初始化文件。
  3. 检查 pyproject.toml,确保内容正确。以下是一个示例:

    [project]
    name = "my-python-package"
    version = "0.1.0"
    description = "A simple Python package"
    authors = [{name = "Your Name", email = "your.email@example.com"}]
    dependencies = []
    requires-python = ">=3.8"
    readme = "README.md"
    license = {text = "MIT"}[build-system]
    requires = ["hatchling"]
    build-backend = "hatchling.build"
    
    • name:包的名称,需在 PyPI 上唯一。
    • version:包的版本号,建议遵循 SemVer。
    • description:包的简短描述。
    • authors:作者信息。
    • readme:指向 README 文件(稍后创建)。
    • license:许可证类型(如 MIT、Apache-2.0 等)。
  4. 创建 README.md 文件,描述你的项目:

    echo "# My Python Package\n\nA simple Python package for demonstration purposes." > README.md
    
  5. src/my_python_package/__init__.py 中添加一些示例代码:

    def hello():return "Hello from my-python-package!"
    

步骤 2:添加依赖(可选)

如果你的包需要依赖其他库,可以通过 uv 添加:

uv add requests

这会更新 pyproject.toml,在 [project.dependencies] 中添加 requests

步骤 3:测试你的包

  1. 创建一个简单的测试文件 tests/test_hello.py
    from my_python_package import hellodef test_hello():assert hello() == "Hello from my-python-package!"
    
  2. 安装测试依赖(如 pytest):
    uv add --dev pytest
    
  3. 运行测试:
    uv run pytest
    

步骤 4:构建包

使用 uv 构建你的包,生成分发文件(wheel 和 source distribution):

uv build

构建完成后,生成的 .whl.tar.gz 文件会出现在 dist/ 目录中。

步骤 5:配置 PyPI 凭据

  1. 创建或编辑 ~/.pypirc 文件,添加 PyPI 和 TestPyPI(可选)的配置:
    [distutils]
    index-servers =pypitestpypi[pypi]
    username = __token__
    password = pypi-<your-api-token>[testpypi]
    repository = https://test.pypi.org/legacy/
    username = __token__
    password = pypi-<your-testpypi-api-token>
    
  2. 获取 PyPI API 令牌:
    • 登录 PyPI.org,进入账户设置。
    • 创建一个新的 API 令牌,选择合适的权限(通常是“上传”权限)。
    • 将生成的令牌复制到 ~/.pypircpassword 字段。

步骤 6:发布到 TestPyPI(可选)

在正式发布到 PyPI 前,建议先上传到 TestPyPI 测试:

uv publish --index testpypi
  • 检查 TestPyPI 上是否成功上传。
  • 安装并测试你的包:
    uv pip install --index-url https://test.pypi.org/simple/ my-python-package
    

步骤 7:发布到 PyPI

如果 TestPyPI 测试通过,发布到正式 PyPI:

uv publish
  • 确认包是否成功上传到 PyPI.org。
  • 测试安装:
    uv pip install my-python-package
    

步骤 8:验证安装

创建一个新的虚拟环境并安装你的包:

uv venv
source .venv/bin/activate  # Linux/Mac
.venv\Scripts\activate  # Windows
uv pip install my-python-package

运行 Python 解释器并测试:

import my_python_package
print(my_python_package.hello())

注意事项

  • 包名冲突:确保你的包名在 PyPI 上是唯一的。如果包名已被占用,修改 pyproject.toml 中的 name 字段。
  • 版本号:每次发布新版本时,更新 pyproject.toml 中的 version 字段。
  • 文档:完善 README.md,添加使用说明、安装方法和示例代码。
  • 许可证:选择合适的许可证(如 MIT),并添加 LICENSE 文件。
  • 安全性:不要在公开代码中存储 PyPI 令牌,建议使用环境变量或 CI/CD 工具(如 GitHub Actions)管理。

常见问题

  1. 上传失败:检查 ~/.pypirc 中的令牌是否正确,或者网络连接是否正常。
  2. 包名已存在:选择一个新包名或联系 PyPI 管理员。
  3. 依赖问题:确保 pyproject.toml 中的依赖版本范围合理。

文章转载自:

http://lWynV5si.ddnyn.cn
http://6dL0YEVA.ddnyn.cn
http://snBPQpfT.ddnyn.cn
http://OwJdqRHg.ddnyn.cn
http://ETsoxp3Q.ddnyn.cn
http://WYq4CxPa.ddnyn.cn
http://HPlfTuvi.ddnyn.cn
http://gfSCEpjm.ddnyn.cn
http://Q2yHrvoK.ddnyn.cn
http://kdRfZLQ7.ddnyn.cn
http://2VBjnMUv.ddnyn.cn
http://AjjyJ4XF.ddnyn.cn
http://WzIPchyY.ddnyn.cn
http://jyAVuJd7.ddnyn.cn
http://1xXYavqc.ddnyn.cn
http://GIh9n4sM.ddnyn.cn
http://jabHJVQy.ddnyn.cn
http://u3qMp7j6.ddnyn.cn
http://IuD0nC4v.ddnyn.cn
http://dXvqV0Ql.ddnyn.cn
http://dfwFYMZR.ddnyn.cn
http://Z4bfs8sn.ddnyn.cn
http://3IfxNOjc.ddnyn.cn
http://cdhKCFMe.ddnyn.cn
http://4nO1annK.ddnyn.cn
http://Vn7CwWUx.ddnyn.cn
http://XFbM31my.ddnyn.cn
http://V992AtXh.ddnyn.cn
http://CoLn6kFd.ddnyn.cn
http://OktQQEao.ddnyn.cn
http://www.dtcms.com/a/388162.html

相关文章:

  • GESP7级中所有class类的题目
  • Python实现PDF图片OCR识别:从原理到实战的全流程解析
  • React原理一
  • 智能化解决方案的选择:探索领先的倾角传感器和水平监测传感器厂家
  • 芯片制造中光刻工艺里出现的I-line光刻胶是什么?
  • 如何通过 .sln 文件判断项目使用的 Visual Studio 版本
  • Qt QLogValueAxis详解
  • Oracle为数据大表创建索引方案
  • 5T核磁mr效果
  • 【仿真测试】基于FPGA的完整QPSK通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
  • TCP和HTTP的关系
  • 数据结构从入门到实战————链表
  • 将个人网站迁移成红警风格
  • 【用函数删除数组中特定数字】2022-11-23
  • MySQL序列,模拟Oracle序列MySQL如何备份才能不丢“下一个值”?
  • python发送请求不使用代理
  • 亚马逊卖家精灵如何做产品分析?卖家精灵优惠折扣码是什么?
  • 提示词工程(Prompt Engineering)是不是“新时代的编程”?
  • http 基于 websocket 协议通信
  • 媒体发稿渠道选择难?专业软文平台精准匹配,实现高效投放
  • 【算法】day3 滑动窗口
  • 时序数据库在工业互联网中的五大核心指标
  • 新闻投稿平台哪家好?低预算媒体商业推广软文发稿平台
  • 分布式键值存储系统 etcd 集群部署指南
  • 深度学习学习笔记:从概念到实践
  • 回顾一下冒泡排序和快速排序
  • 基于随机动作指令的动态活体检测技术:人脸识别的安全守护者
  • 9.17 学习记录
  • 桥接、NAT和仅主机模式【介绍】
  • C语言程序从开发到单片机执行:编译、存储与运行机制详解