文章目錄
- 前言
- 簡介
- 一、核心功能
- 1.依賴管理
- 自動安裝依賴
- 版本約束
- 額外依賴組
- 命令行工具
- 插件系統
- 2.開發模式安裝
- 3.資源文件管理
- 4.Egg 分發(已逐漸被 Wheel 取代)
- 5.命名空間包
- 二、基礎用法
- 1. 項目結構示例
- 2. 配置文件 setup.cfg
- 3. setup.py 最小化示例(現代項目可省略)
- 4. 常用命令
- 三、進階用法與最佳實踐
- 1. 動態版本號
- 2. 包含數據文件
- 3. Cython 擴展
- 4. 兼容性標記
- 5. 自定義構建命令
- 四、常見問題解決
- 1.找不到包?
- 2.資源文件未包含?
- 3.Entry Point 不生效?
- 五、生態工具鏈整合
- 1.構建
- 2.上傳
- 3.虛擬環境
- 4.測試
- 5.文檔
- 總結
前言
本文僅僅簡單介紹了Python中setuptools的模塊的功能以及使用方法。
簡介
setuptools 是 Python 生態中用于打包和分發項目的核心工具,它擴展了 Python 原生的 distutils 模塊,提供了更強大的功能和更便捷的配置方式。以下從功能、用法和最佳實踐三個維度進行詳細說明:
一、核心功能
1.依賴管理
自動安裝依賴
自動安裝依賴:通過 install_requires 聲明依賴,pip install 時會自動安裝。
版本約束
版本約束:支持語義化版本(如 >=2.0,??.0)。
額外依賴組
額外依賴組:通過 extras_require 定義可選依賴(如測試、文檔依賴)。
命令行工具
命令行工具:將 Python 函數映射為命令行命令(如 pip 自身即通過 entry point 實現)。
插件系統
插件系統:其他程序可通過 entry points 動態發現并加載你的包(如 pytest 插件)。
2.開發模式安裝
pip install -e .:將包以“可編輯模式”安裝,代碼修改無需重新安裝,直接生效。
3.資源文件管理
自動包含 package_data 中聲明的非代碼文件(如配置文件、模板)。
4.Egg 分發(已逐漸被 Wheel 取代)
提供 .egg 格式分發,支持二進制依賴(現推薦使用 wheel 格式)。
5.命名空間包
支持在多個項目中共享同一個包命名空間(如 google.cloud.storage 和 google.cloud.bigquery)。
二、基礎用法
1. 項目結構示例
my_project/
├── src/ # 推薦使用 src 目錄隔離源碼
│ └── my_pkg/
│ ├── __init__.py
│ └── module.py
├── tests/
├── pyproject.toml # 構建系統聲明
├── setup.cfg # 推薦:靜態配置
└── setup.py # 動態配置(可選,逐漸被 setup.cfg 替代)
2. 配置文件 setup.cfg
[metadata]
name = my_pkg
version = 1.0.0
author = Your Name
description = A sample package[options]
package_dir = = src
packages = find: # 自動查找包
install_requires =requests>=2.24.0numpy~=1.20.0[options.extras_require]
test =pytest>=6.0
dev = %(test)sflake8>=3.8[options.entry_points]
console_scripts =mycli = my_pkg.cli:main
pytest11 =myplugin = my_pkg.pytest_plugin
3. setup.py 最小化示例(現代項目可省略)
from setuptools import setupsetup()
4. 常用命令
#安裝開發模式
pip install -e .#構建源碼包和 Wheel
python -m build#上傳到 PyPI
twine upload dist/*
三、進階用法與最佳實踐
1. 動態版本號
在 setup.cfg 中引用 __version__:#my_pkg/__init__.py
__version__ = "1.2.3"#setup.cfg
[metadata]
version = attr: my_pkg.__version__
2. 包含數據文件
[options]
include_package_data = True[options.package_data]
my_pkg =data/*.jsonconfigs/*.yml
3. Cython 擴展
from setuptools import setup, Extension
from Cython.Build import cythonizeextensions = [Extension("my_pkg.optimized", ["src/my_pkg/optimized.pyx"])
]setup(ext_modules=cythonize(extensions))
4. 兼容性標記
[metadata]
classifiers =Programming Language :: Python :: 3Programming Language :: Python :: 3.8Programming Language :: Python :: 3.9
5. 自定義構建命令
繼承 setuptools.Command 實現自定義命令:
from setuptools import setup, Commandclass CustomCommand(Command):def run(self):print("Running custom task...")setup(cmdclass={'custom': CustomCommand})
四、常見問題解決
1.找不到包?
使用 package_dir 和 packages=find: 自動檢測。
確保 init.py 存在于每個包目錄。
2.資源文件未包含?
檢查 MANIFEST.in 或 include_package_data=True。
3.Entry Point 不生效?
確認函數簽名正確(如 def main():)。
重新安裝包(pip install -e .)。
五、生態工具鏈整合
1.構建
構建:使用 build 替代 python setup.py sdist bdist_wheel
2.上傳
上傳:使用 twine 替代 setup.py upload
3.虛擬環境
虛擬環境:結合 virtualenv/venv
4.測試
測試:通過 tox 實現多環境測試
5.文檔
文檔:與 Sphinx 集成生成文檔
通過合理使用 setuptools,可以實現從代碼管理到分發的全流程標準化,建議結合 pyproject.toml (PEP 621) 實現更現代的配置方式。
總結
以上就是今天要講的內容,本文僅僅簡單介紹了Python中setuptools的模塊的功能以及使用方法。