1. 库简介
setuptools
是Python生态系统中最重要的包分发工具之一,它是distutils
的增强版,提供了更多功能和更好的用户体验。setuptools
不仅支持基本的包分发功能,还提供了依赖管理、入口点、开发模式等高级特性,是现代Python包开发的标准工具。
2. 安装方法
pip install setuptools
3. 核心功能详解
3.1 创建setup.py文件
from setuptools import setup, find_packages
setup(
name="mypackage",
version="1.0.0",
packages=find_packages(),
install_requires=[
"requests>=2.25.0",
"numpy>=1.19.0",
],
python_requires=">=3.6",
)
3.2 定义包依赖
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
install_requires=[
"requests>=2.25.0,<3.0.0",
"numpy>=1.19.0,<2.0.0",
],
extras_require={
"dev": ["pytest>=6.0", "black>=20.8b1"],
"docs": ["sphinx>=3.0", "sphinx-rtd-theme>=0.5.0"],
},
)
3.3 包含数据文件
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
package_data={
"mypackage": ["data/*.dat", "config/*.cfg"],
},
data_files=[("config", ["config/settings.cfg"])],
include_package_data=True,
)
3.4 创建命令行工具
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
entry_points={
"console_scripts": [
"mycommand=mypackage.cli:main",
],
},
)
3.5 构建C扩展
from setuptools import setup, Extension
module = Extension(
"mymodule",
sources=["src/mymodule.c"],
include_dirs=["include"],
libraries=["mylib"],
define_macros=[("DEBUG", "1")],
)
setup(
name="mypackage",
version="1.0.0",
ext_modules=[module],
)
3.6 开发模式安装
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
packages=["mypackage"],
# 开发模式安装
# pip install -e .
)
3.7 创建发布包
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
packages=["mypackage"],
# 创建源码发布包
# python setup.py sdist
# 创建wheel包
# python setup.py bdist_wheel
)
3.8 添加测试支持
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
packages=["mypackage"],
test_suite="tests",
tests_require=["pytest>=6.0"],
# 运行测试
# python setup.py test
)
4. 高级特性
4.1 使用setup.cfg配置
[metadata]
name = mypackage
version = 1.0.0
description = A sample package
author = Your Name
author_email = your.email@example.com
[options]
packages = find:
install_requires =
requests>=2.25.0
numpy>=1.19.0
[options.extras_require]
dev =
pytest>=6.0
black>=20.8b1
4.2 使用pyproject.toml
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mypackage"
version = "1.0.0"
description = "A sample package"
requires-python = ">=3.6"
dependencies = [
"requests>=2.25.0",
"numpy>=1.19.0",
]
[tool.setuptools]
packages = ["mypackage"]
5. 最佳实践
- 使用
pyproject.toml
作为主要配置文件 - 使用
find_packages()
自动发现包 - 明确指定Python版本要求
- 使用
entry_points
创建命令行工具 - 为开发依赖创建额外的需求组
6. 常见问题解决
6.1 处理依赖冲突
from setuptools import setup
setup(
name="mypackage",
version="1.0.0",
install_requires=[
"requests>=2.25.0,<3.0.0",
"numpy>=1.19.0,<2.0.0",
],
dependency_links=[
"https://github.com/user/repo/tarball/master#egg=package-1.0",
],
)
6.2 处理平台特定的代码
from setuptools import setup
import sys
if sys.platform == "win32":
extra_compile_args = ["/O2"]
else:
extra_compile_args = ["-O3"]
setup(
name="mypackage",
version="1.0.0",
ext_modules=[
Extension(
"mymodule",
sources=["src/mymodule.c"],
extra_compile_args=extra_compile_args,
),
],
)
7. 性能优化建议
- 使用
wheel
格式分发包 - 合理组织包结构
- 使用
__init__.py
文件控制导入 - 优化构建过程
- 使用缓存加速构建
8. 总结
setuptools
是现代Python包分发的标准工具,它提供了丰富的功能和灵活的配置选项。通过本文的介绍,你应该已经掌握了setuptools
的主要功能和使用方法。在实际开发中,合理使用这些功能可以大大提高开发效率和代码质量。