您好,登录后才能下订单哦!
# 怎么使用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. 文档和许可证放在根目录
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版本要求
)
setup(
# ...其他参数...
install_requires=[ # 核心依赖
'requests>=2.25.1',
'numpy',
],
extras_require={ # 可选依赖
'dev': ['pytest>=6.0'],
'gui': ['pyqt5>=5.15'],
},
)
创建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'],
},
)
python setup.py sdist
生成.tar.gz源码包,位于dist/目录
pip install wheel
python setup.py bdist_wheel
生成.whl二进制包,安装更快且无需编译
推荐同时生成两种格式:
python setup.py sdist bdist_wheel
pip install twine
twine upload dist/*
测试上传(使用test.pypi.org):
twine upload --repository testpypi dist/*
setup(
# ...其他参数...
entry_points={
'console_scripts': [
'my_command=my_package.cli:main',
],
'gui_scripts': [
'my_gui=my_package.gui:launch',
]
}
)
setup(
name="my_package.submodule",
packages=["my_package.submodule"],
namespace_packages=["my_package"]
)
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认证
示例完整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,支持目录跳转和代码高亮。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。