Python每日一库:setuptools - 现代Python包分发工具

在这里插入图片描述

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. 最佳实践

  1. 使用pyproject.toml作为主要配置文件
  2. 使用find_packages()自动发现包
  3. 明确指定Python版本要求
  4. 使用entry_points创建命令行工具
  5. 为开发依赖创建额外的需求组

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. 性能优化建议

  1. 使用wheel格式分发包
  2. 合理组织包结构
  3. 使用__init__.py文件控制导入
  4. 优化构建过程
  5. 使用缓存加速构建

8. 总结

setuptools是现代Python包分发的标准工具,它提供了丰富的功能和灵活的配置选项。通过本文的介绍,你应该已经掌握了setuptools的主要功能和使用方法。在实际开发中,合理使用这些功能可以大大提高开发效率和代码质量。

9. 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aerkui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值