使用 uv 发布 Python 包到 PyPI 教程

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

前提条件

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

安装 uv

pip install uv 

步骤 1:创建项目结构

    • pyproject.toml:项目的元数据和依赖配置文件。
    • src/my_python_package/__init__.py:包的初始化文件。
    • name:包的名称,需在 PyPI 上唯一。
    • version:包的版本号,建议遵循 SemVer
    • description:包的简短描述。
    • authors:作者信息。
    • readme:指向 README 文件(稍后创建)。
    • license:许可证类型(如 MIT、Apache-2.0 等)。

src/my_python_package/__init__.py 中添加一些示例代码:

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

创建 README.md 文件,描述你的项目:

echo"# My Python Package\n\nA simple Python package for demonstration purposes."> README.md 

检查 pyproject.toml,确保内容正确。以下是一个示例:

[project] name = "my-python-package" version = "0.1.0" description = "A simple Python package" authors = [{name = "Your Name", email = "[email protected]"}] dependencies = [] requires-python = ">=3.8" readme = "README.md" license = {text = "MIT"} [build-system] requires = ["hatchling"] build-backend = "hatchling.build" 

初始化项目:

uv init 

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

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

mkdir my-python-package cd my-python-package 

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

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

uv add requests 

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

步骤 3:测试你的包

运行测试:

uv run pytest 

安装测试依赖(如 pytest):

uv add --dev pytest 

创建一个简单的测试文件 tests/test_hello.py

from my_python_package import hello deftest_hello():assert hello()=="Hello from my-python-package!"

步骤 4:构建包

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

uv build 

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

步骤 5:配置 PyPI 凭据

  1. 获取 PyPI API 令牌:
    • 登录 PyPI.org,进入账户设置。
    • 创建一个新的 API 令牌,选择合适的权限(通常是“上传”权限)。
    • 将生成的令牌复制到 ~/.pypircpassword 字段。

创建或编辑 ~/.pypirc 文件,添加 PyPI 和 TestPyPI(可选)的配置:

[distutils] index-servers = pypi testpypi [pypi] username = __token__ password = pypi-<your-api-token> [testpypi] repository = https://test.pypi.org/legacy/ username = __token__ password = pypi-<your-testpypi-api-token> 

步骤 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 中的依赖版本范围合理。

Read more

华为OD机试真题2025双机位A卷 Java&Go 实现【采购订单】

华为OD机试真题2025双机位A卷 Java&Go 实现【采购订单】

目录 题目 思路 Code 题目 在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。 具体规则如下: 如果PR状态为"审批通过",则将其商品加入到PO中。如果PR的状态为"审批拒绝"或"待审批",则忽略改PR,对于单价高于100元的商品、每个商品单独生成一条PO记录。对于单价低于100元的商品,将相同商品的数量合并四到一条PO记录中。如果商品单价<100且商品数量>=100,则单价打9折。 输入描述 第一行包含整数N,表示PR的数量。 接下来N行,每行包含四个用空格分割的整数,按顺序表示:商品ID,

By Ne0inhk
Flutter 组件 analyzer_testing 适配鸿蒙 HarmonyOS 实战:分析器插件测试,构建 AST 仿真与编译器级别静态诊断验证架构

Flutter 组件 analyzer_testing 适配鸿蒙 HarmonyOS 实战:分析器插件测试,构建 AST 仿真与编译器级别静态诊断验证架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 analyzer_testing 适配鸿蒙 HarmonyOS 实战:分析器插件测试,构建 AST 仿真与编译器级别静态诊断验证架构 前言 在鸿蒙(OpenHarmony)生态迈向深度定制化研发、涉及高性能自定义 Lint 规则集开发、代码自动化重构工具链及严苛的编译器插件质量底线的背景下,如何实现一套能够精确模拟抽象语法树(AST)、支持在无文件系统环境下执行实时代码分析且具备“像素级”错误定位能力的“分析器测试基座”,已成为决定研发工具链稳定性与代码诊断准确性的命脉。在鸿蒙项目涉及海量 eTS 与 Flutter 代码混合静态检查的复杂场景下,如果开发的分析器插件未经严格的语法全集覆盖测试,由于由于分析引擎的内部状态复杂性,极易由于由于“误报”或“漏报”导致鸿蒙应用在编译期发生难以排查的元数据错误。 我们需要一种能够解耦物理磁盘、支持声明式代码片段输入且具备 AST 结构断言能力的验证方案。 analyzer_testing 为

By Ne0inhk
Apache Curator LeaderSelector 深度解析:分布式领导者选举的优雅实现

Apache Curator LeaderSelector 深度解析:分布式领导者选举的优雅实现

Apache Curator LeaderSelector 深度解析:分布式领导者选举的优雅实现 * 一、领导者选举概述 * 1.1 什么是领导者选举? * 1.2 领导者选举的应用场景 * 二、LeaderSelector 核心使用指南 * 2.1 环境准备 * 2.2 基础使用示例 * 2.3 核心接口详解 * 三、LeaderSelector 工作原理深度剖析 * 3.1 整体架构图 * 3.2 核心原理:基于临时顺序节点 * 3.3 公平性保证 * 3.4 状态管理与异常处理 * 四、高级特性与最佳实践 * 4.1 自动重新入队:autoRequeue() * 4.2 设置参与者

By Ne0inhk
MySQL 动态分区管理:自动化与优化实践

MySQL 动态分区管理:自动化与优化实践

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * MySQL 动态分区管理:自动化与优化实践 * 一、分区的基本概念 * 二、动态分区的需求 * 三、使用存储过程动态创建分区 * 四、使用事件调度器自动化分区管理 * 五、避免分区冲突

By Ne0inhk