如何將Python包發(fā)布到PyPI的完整指南
簡介
PyPI(Python Package Index)是 Python 官方的第三方軟件倉庫,是分發(fā) Python 包的標準平臺。本文將詳細介紹如何準備、打包并發(fā)布Python 項目到 PyPI,并能讓其他開發(fā)者通過 pip install 來使用您的包。
前期準備
1. 注冊 PyPI 賬戶
首先,需要在以下兩個平臺注冊賬戶:
- PyPI 正式環(huán)境: https://pypi.org/account/register/
- PyPI 測試環(huán)境: https://test.pypi.org/account/register/
先在測試環(huán)境中練習發(fā)布流程,確保一切正常后再發(fā)布到正式環(huán)境。
2. 安裝必要工具
pip install --upgrade pip pip install --upgrade build pip install --upgrade twine
build: 用于構建分發(fā)包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 (推薦)
這是現(xiàn)代 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 (傳統(tǒng)方式,仍被廣泛支持)
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
動態(tài)版本管理
可以使用工具自動管理版本號:
# src/my_package/__init__.py __version__ = "0.1.0"
# pyproject.toml
[project]
dynamic = ["version"]
[tool.setuptools.dynamic]
version = {attr = "my_package.__version__"}
構建和發(fā)布流程
本地測試
在發(fā)布前,確保包能正確安裝和使用:
# 構建包 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__)"
發(fā)布到測試環(huán)境
注冊Test PyPI賬號和獲取API密鑰,如下圖所示

安裝發(fā)布工具
pip install twine
檢查包的有效性
twine check dist/*

上傳到測試PyPI,輸入api密鑰
twine upload --repository testpypi dist/*

發(fā)布到正式環(huán)境
注冊PyPI賬號和獲取API密鑰,如下圖所示

上傳包到正式環(huán)境
twine upload dist/*

使用配置文件上傳到Pypi
創(chuàng)建
~/.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
上傳到測試環(huán)境
twine upload --repository testpypi dist/*
上傳到正式環(huán)境
twine upload dist/*
測試上傳的包
建立一個新項目,測試剛剛發(fā)布的包
pip install dlt645

調(diào)用函數(shù),測試通過

自動化發(fā)布
使用 GitHub Actions
創(chuàng)建 .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. 包名沖突
如果包名已被占用,需要選擇其他名稱??梢裕?/p>
- 添加前綴或后綴
- 使用更具描述性的名稱
2. 上傳失敗
常見原因:
- 版本號重復
- 認證信息錯誤
- 網(wǎng)絡連接問題
3. 安裝后導入失敗
檢查:
- 包結構是否正確
__init__.py文件是否存在- 模塊路徑是否正確
維護和更新
發(fā)布新版本
- 更新版本號
- 更新 CHANGELOG
- 構建新包
- 上傳到 PyPI
廢棄舊版本
可以在 PyPI 上標記特定版本為已廢棄,但不能刪除已發(fā)布的版本。
總結
到此這篇關于如何將Python包發(fā)布到PyPI的文章就介紹到這了,更多相關Python包發(fā)布到PyPI內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pandas dataframe 中的explode函數(shù)用法詳解
這篇文章主要介紹了pandas dataframe 中的explode函數(shù)用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
使用wxPython實現(xiàn)Windows11任務欄通知功能
這篇文章主要為大家詳細介紹了如何使用 wxPython 模塊,在 Windows 11 中實現(xiàn)任務欄通知功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下2023-10-10
Python實現(xiàn)采用進度條實時顯示處理進度的方法
這篇文章主要介紹了Python實現(xiàn)采用進度條實時顯示處理進度的方法,涉及Python數(shù)學運算結合時間函數(shù)顯示進度效果的相關操作技巧,需要的朋友可以參考下2017-12-12
如何將Pycharm中Terminal使用Powershell作為終端
這篇文章主要介紹了如何將Pycharm中Terminal使用Powershell作為終端問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
TensorFlow2.4完成Word2vec詞嵌入訓練方法詳解
這篇文章主要為大家介紹了TensorFlow2.4完成Word2vec詞嵌入訓練方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

