如何将Python包发布到PyPI的完整指南

 更新时间:2025年11月29日 08:30:30   作者:MC皮蛋侠客  
PyPI(Python Package Index)是python官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI,这篇文章主要介绍了如何将Python包发布到PyPI的完整指南,文中通过代码介绍的非常详细,需要的朋友可以参考下

简介

PyPI(Python Package Index)是 Python 官方的第三方软件仓库,是分发 Python 包的标准平台。本文将详细介绍如何准备、打包并发布Python 项目到 PyPI,并能让其他开发者通过 pip install 来使用您的包。

前期准备

1. 注册 PyPI 账户

首先,需要在以下两个平台注册账户:

  • PyPI 正式环境: https://pypi.org/account/register/
  • PyPI 测试环境: https://test.pypi.org/account/register/

先在测试环境中练习发布流程,确保一切正常后再发布到正式环境。

2. 安装必要工具

pip install --upgrade pip
pip install --upgrade build
pip install --upgrade twine
  • build: 用于构建分发包
  • twine: 用于上传包到 PyPI

项目结构准备

一个标准的 Python 包应该具有以下结构:

my_package/
├── src/
│   └── my_package/
│       ├── __init__.py
│       └── module.py
├── tests/
│   └── test_module.py
├── README.md
├── LICENSE
├── pyproject.toml
└── setup.py (可选)

关键文件说明

1. pyproject.toml (推荐)

这是现代 Python 包的标准配置文件:

[build-system]
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "my-awesome-package"
version = "0.1.0"
authors = [
    {name = "Your Name", email = "your.email@example.com"},
]
description = "A small example package"
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.7"
classifiers = [
    "Development Status :: 3 - Alpha",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
]
keywords = ["example", "package", "tutorial"]
dependencies = [
    "requests>=2.25.0",
    "numpy>=1.20.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=6.0",
    "black",
    "flake8",
]

[project.urls]
Homepage = "https://github.com/yourusername/my-awesome-package"
Repository = "https://github.com/yourusername/my-awesome-package"
Documentation = "https://my-awesome-package.readthedocs.io/"
"Bug Tracker" = "https://github.com/yourusername/my-awesome-package/issues"

[project.scripts]
my-command = "my_package.cli:main"

2. setup.py (传统方式,仍被广泛支持)

from setuptools import setup, find_packages

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setup(
    name="my-awesome-package",
    version="0.1.0",
    author="Your Name",
    author_email="your.email@example.com",
    description="A small example package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/yourusername/my-awesome-package",
    project_urls={
        "Bug Tracker": "https://github.com/yourusername/my-awesome-package/issues",
    },
    classifiers=[
        "Development Status :: 3 - Alpha",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: MIT License",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
    ],
    package_dir={"": "src"},
    packages=find_packages(where="src"),
    python_requires=">=3.7",
    install_requires=[
        "requests>=2.25.0",
        "numpy>=1.20.0",
    ],
    extras_require={
        "dev": [
            "pytest>=6.0",
            "black",
            "flake8",
        ],
    },
    entry_points={
        "console_scripts": [
            "my-command=my_package.cli:main",
        ],
    },
)

3.README.md

编写清晰的说明文档,包括:

  • 项目简介
  • 安装方法
  • 使用示例
  • API 文档
  • 贡献指南

4.LICENSE

选择合适的开源许可证,常见的有:

  • MIT License(最宽松)
  • Apache License 2.0
  • GNU GPL v3(最严格)

版本管理

语义化版本控制

遵循 Semantic Versioning 标准:

  • 主版本号:不兼容的 API 修改
  • 次版本号:向下兼容的功能新增
  • 修订版本号:向下兼容的问题修正

例如:1.2.3

动态版本管理

可以使用工具自动管理版本号:

# src/my_package/__init__.py
__version__ = "0.1.0"
# pyproject.toml
[project]
dynamic = ["version"]

[tool.setuptools.dynamic]
version = {attr = "my_package.__version__"}

构建和发布流程

本地测试

在发布前,确保包能正确安装和使用:

# 构建包
python -m build

# 本地安装测试
pip install dist/my_awesome_package-0.1.0-py3-none-any.whl

# 测试导入
python -c "import my_package; print(my_package.__version__)"

发布到测试环境

  1. 注册Test PyPI账号和获取API密钥,如下图所示

  2. 安装发布工具

    pip install twine
    
  3. 检查包的有效性

    twine check dist/*
    

  4. 上传到测试PyPI,输入api密钥

    twine upload --repository testpypi dist/*
    

发布到正式环境

  1. 注册PyPI账号和获取API密钥,如下图所示

  2. 上传包到正式环境

    twine upload dist/*
    

使用配置文件上传到Pypi

  1. 创建 ~/.pypirc 文件:

    [distutils]
    index-servers = pypi testpypi
    
    [pypi]
    username = __token__
    password = pypi-your-api-token-here
    
    [testpypi]
    repository = https://test.pypi.org/legacy/
    username = __token__
    password = pypi-your-test-api-token-here
    
  2. 上传到测试环境

    twine upload --repository testpypi dist/*
    
  3. 上传到正式环境

    twine upload dist/*
    

测试上传的包

  1. 建立一个新项目,测试刚刚发布的包

    pip install dlt645
    

  2. 调用函数,测试通过

自动化发布

使用 GitHub Actions

创建 .github/workflows/publish.yml

name: Publish to PyPI

on:
  release:
    types: [published]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.x'
    
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install build twine
    
    - name: Build package
      run: python -m build
    
    - name: Publish to PyPI
      env:
        TWINE_USERNAME: __token__
        TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
      run: twine upload dist/*

常见问题和解决方案

1. 包名冲突

如果包名已被占用,需要选择其他名称。可以:

  • 添加前缀或后缀
  • 使用更具描述性的名称

2. 上传失败

常见原因:

  • 版本号重复
  • 认证信息错误
  • 网络连接问题

3. 安装后导入失败

检查:

  • 包结构是否正确
  • __init__.py 文件是否存在
  • 模块路径是否正确

维护和更新

发布新版本

  1. 更新版本号
  2. 更新 CHANGELOG
  3. 构建新包
  4. 上传到 PyPI

废弃旧版本

可以在 PyPI 上标记特定版本为已废弃,但不能删除已发布的版本。

总结

到此这篇关于如何将Python包发布到PyPI的文章就介绍到这了,更多相关Python包发布到PyPI内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何破解压缩包密码

    Python如何破解压缩包密码

    破解rar和zip压缩包。Windows下使用PyCharm软件,本文给大家详细介绍Python如何破解压缩包密码,感兴趣的朋友一起看看吧
    2022-05-05
  • Python中基础数据类型 set集合知识点总结

    Python中基础数据类型 set集合知识点总结

    在本篇文章里小编给大家总结了一篇关于Python中基础数据类型 set集合知识点总结内容,有需要的朋友们可以学习下。
    2021-08-08
  • python元组的可变与不可变问题

    python元组的可变与不可变问题

    这篇文章主要介绍了python元组的可变与不可变问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Python类的继承用法示例

    Python类的继承用法示例

    这篇文章主要介绍了Python类的继承用法,结合实例形式分析了Python类的定义、继承等相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • Python中Dataframe数据排序方法(含实例讲解)

    Python中Dataframe数据排序方法(含实例讲解)

    在进行数据分析操作时,经常需要对数据按照某行某列排序,或者按照多行多列排序,以及按照索引值排序等等,下面这篇文章主要给大家介绍了关于Python中Dataframe数据排序方法的相关资料,需要的朋友可以参考下
    2023-02-02
  • Python flask项目入门教程

    Python flask项目入门教程

    flask 是一门使用 python 编写的后端框架,这篇文章主要介绍了Python flask项目入门教程,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • Python Tkinter Entry和Text的添加与使用详解

    Python Tkinter Entry和Text的添加与使用详解

    这篇文章主要介绍了Python Tkinter Entry和Text的添加与使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 浅析Python如何实现Celery任务队列系统

    浅析Python如何实现Celery任务队列系统

    这篇文章主要为大家详细介绍了一个基于 Celery 和 Redis 的分布式任务队列系统,用于处理异步任务和定时任务,希望对大家有一定的帮助
    2025-04-04
  • python使用Matplotlib绘制多种常见图形

    python使用Matplotlib绘制多种常见图形

    这篇文章主要介绍了python使用Matplotlib绘制多种常见图形,文章围绕主题展开详细的用Matplotlib绘制内容,需要的小伙伴可以参考一下
    2022-05-05
  • 使用Pandas修改DataFrame中某一列的值

    使用Pandas修改DataFrame中某一列的值

    DataFrame是Pandas中的主要数据结构之一,下面这篇文章主要给大家介绍了关于使用Pandas修改DataFrame中某一列的值的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论