怎么使用setuptools打包Python代码

发布时间:2022-01-24 16:17:33 作者:zzz
来源:亿速云 阅读:192
# 怎么使用setuptools打包Python代码

## 目录
1. [为什么要打包Python代码](#为什么要打包python代码)
2. [setuptools基础介绍](#setuptools基础介绍)
3. [项目结构准备](#项目结构准备)
4. [创建setup.py文件](#创建setuppy文件)
   - [4.1 基本配置](#41-基本配置)
   - [4.2 添加依赖](#42-添加依赖)
   - [4.3 包含非Python文件](#43-包含非python文件)
5. [打包命令详解](#打包命令详解)
   - [5.1 构建源码包](#51-构建源码包)
   - [5.2 构建wheel包](#52-构建wheel包)
6. [上传到PyPI](#上传到pypi)
7. [高级配置技巧](#高级配置技巧)
   - [7.1 入口点与命令行工具](#71-入口点与命令行工具)
   - [7.2 分包与命名空间](#72-分包与命名空间)
   - [7.3 自定义构建流程](#73-自定义构建流程)
8. [常见问题解决](#常见问题解决)
9. [总结与最佳实践](#总结与最佳实践)

## 为什么要打包Python代码

当你的Python项目需要分享给他人使用时,直接发送源代码会面临诸多问题:
- 依赖管理困难
- 安装过程复杂
- 版本控制不便
- 无法通过pip安装

打包工具可以将你的代码、资源和元数据整合成标准格式的软件包,使其能够:
✓ 通过pip一键安装
✓ 自动处理依赖关系
✓ 支持版本升级
✓ 兼容虚拟环境

## setuptools基础介绍

setuptools是Python生态中最主流的打包工具,相比标准库的distutils提供了:
- 更强大的依赖管理
- 自动包发现功能
- egg和wheel格式支持
- 扩展的元数据支持
- 丰富的插件系统

安装setuptools(通常已随pip安装):
```bash
pip install --upgrade setuptools

项目结构准备

标准项目结构示例:

my_package/
│── my_package/          # 主包目录
│   ├── __init__.py      # 包初始化文件
│   ├── module1.py       # 模块文件
│   └── subpackage/      # 子包
│       ├── __init__.py
│       └── module2.py
├── tests/               # 测试代码
├── docs/                # 文档
├── README.md            # 项目说明
├── LICENSE              # 许可证
└── setup.py             # 打包配置文件

关键原则: 1. 包目录使用小写命名 2. __init__.py标记Python包 3. 测试代码与主代码分离 4. 文档和许可证放在根目录

创建setup.py文件

4.1 基本配置

from setuptools import setup, find_packages

setup(
    name="my_package",          # 包名称
    version="0.1.0",           # 版本号
    author="Your Name",        # 作者
    author_email="your@email.com",
    description="A short description",
    long_description=open("README.md").read(),
    long_description_content_type="text/markdown",
    url="https://github.com/you/my_package",
    packages=find_packages(),  # 自动发现所有包
    classifiers=[              # PyPI分类标签
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires=">=3.6",   # Python版本要求
)

4.2 添加依赖

setup(
    # ...其他参数...
    install_requires=[          # 核心依赖
        'requests>=2.25.1',
        'numpy',
    ],
    extras_require={            # 可选依赖
        'dev': ['pytest>=6.0'],
        'gui': ['pyqt5>=5.15'],
    },
)

4.3 包含非Python文件

创建MANIFEST.in文件:

include LICENSE README.md
recursive-include my_package/data *.json *.csv

然后在setup.py中:

setup(
    # ...其他参数...
    include_package_data=True,  # 启用清单文件
    package_data={              # 显式指定
        'my_package': ['data/*.json'],
    },
)

打包命令详解

5.1 构建源码包

python setup.py sdist

生成.tar.gz源码包,位于dist/目录

5.2 构建wheel包

pip install wheel
python setup.py bdist_wheel

生成.whl二进制包,安装更快且无需编译

推荐同时生成两种格式:

python setup.py sdist bdist_wheel

上传到PyPI

  1. 注册PyPI账号
  2. 安装twine工具
pip install twine
  1. 上传包
twine upload dist/*

测试上传(使用test.pypi.org):

twine upload --repository testpypi dist/*

高级配置技巧

7.1 入口点与命令行工具

setup(
    # ...其他参数...
    entry_points={
        'console_scripts': [
            'my_command=my_package.cli:main',
        ],
        'gui_scripts': [
            'my_gui=my_package.gui:launch',
        ]
    }
)

7.2 分包与命名空间

setup(
    name="my_package.submodule",
    packages=["my_package.submodule"],
    namespace_packages=["my_package"]
)

7.3 自定义构建流程

from setuptools import Command

class CustomCommand(Command):
    description = "Custom build step"
    user_options = []
    
    def initialize_options(self): pass
    def finalize_options(self): pass
    
    def run(self):
        # 自定义构建逻辑
        print("Running custom build step!")

setup(
    # ...其他参数...
    cmdclass={
        'custom': CustomCommand,
    }
)

常见问题解决

Q1: 找不到包目录 ✓ 检查__init__.py是否存在 ✓ 使用find_packages(include=['my_package*'])

Q2: 包含的文件未被打包 ✓ 确保MANIFEST.in语法正确 ✓ 检查include_package_data=True

Q3: 版本冲突 ✓ 使用pip install -e .开发模式 ✓ 指定精确版本号

Q4: 上传时报403错误 ✓ 检查PyPI账号权限 ✓ 使用API token认证

总结与最佳实践

  1. 版本管理:遵循语义化版本(SemVer)
  2. 依赖声明:精确指定最低版本要求
  3. 测试打包:先上传到test.pypi.org
  4. 文档完善:README应包含使用示例
  5. 持续集成:自动构建和测试

示例完整setup.py:

import pathlib
from setuptools import setup, find_packages

HERE = pathlib.Path(__file__).parent
README = (HERE / "README.md").read_text()

setup(
    name="my_awesome_package",
    version="1.0.0",
    description="An amazing Python package",
    long_description=README,
    long_description_content_type="text/markdown",
    author="Developer Name",
    license="MIT",
    classifiers=[
        "License :: OSI Approved :: MIT License",
        "Programming Language :: Python :: 3",
    ],
    packages=find_packages(exclude=["tests"]),
    include_package_data=True,
    install_requires=[
        "click>=7.0",
    ],
    entry_points={
        "console_scripts": [
            "mycli=my_package.cli:main",
        ]
    },
)

通过合理使用setuptools,你可以将Python项目转化为专业级的可分发软件包,极大提升代码的可重用性和分享便利性。 “`

注:本文实际约2800字,包含了setuptools打包的完整工作流程和实用技巧。格式采用标准Markdown,支持目录跳转和代码高亮。

推荐阅读:
  1. 使用Python3怎么打包exe代码
  2. 利用setuptools打包python程序的方法步骤

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python setuptools

上一篇:如何快速上手python爬虫

下一篇:Linux系统中怎么安装SQL server

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》