
本文共 3272 字,大约阅读时间需要 10 分钟。
setutils: Python包打包与分发的强大工具
setuptools 是 Python 标准库 distutils 的一个增强版本,它为 Python 开发者提供了一套更为简便和强大的工具,用于创建、打包和分发 Python 包。通过 setutils,开发者可以轻松管理依赖项,快速构建高质量的 Python 包,同时无需预先安装 setutils 即可使用。
1. 基本打包流程
使用 setutils 创建一个简单的 Python 包,步骤简单明了:
cd /tmpmkdir democd demotouch setup.py
打开 setup.py
文件,添加以下内容:
from setuptools import setup, find_packagessetup( name="demo", version="0.1", packages=find_packages(),)
运行以下命令打包:
python setup.py bdist_egg
打包后,会在当前目录下生成 dist
目录,包含一个名为 demo-0.1-py2.7.egg
的 egg 包。
2. setup() 函数的核心参数
setup()
函数接受多个关键参数,用于定义包的基本信息和打包规则:
- name:指定包的名称。
- version:指定包的版本号。
- packages:指定要打包的 Python 包路径,默认使用
find_packages()
寻找所有包。 - include_package_data:启用清单文件(如 MANIFEST.in),包含非源代码文件。
3. 包含静态文件
为了包含静态文件(如图片、CSS、JavaScript),可以使用 MANIFEST.in 文件清单:
mkdir -p setup-demo/MANIFEST.in
在 MANIFEST.in 文件中,添加以下内容:
recursive-include static/
在 setup.py
中启用清单文件,并指定 include_package_data=True
:
from setuptools import setup, find_packagessetup( name="static-package", version="1.0", packages=find_packages(), include_package_data=True,)
4. 自动安装依赖项
为了确保依赖包的自动安装,可以在 setup.py
中指定 install_requires
参数:
from setuptools import setup, find_packagessetup( name="myapp", version="1.0", packages=find_packages(), install_requires=[ "requests>=2.26.0", "pandas>=1.5.0", ],)
5. 使用 entry points 定义 CLI 工作流程
通过 entry_points
参数,可以将包中的脚本注册为命令行工具:
from setuptools import setup, find_packagessetup( name="myapp", version="1.0", packages=find_packages(), entry_points={ "console_scripts": [ "myapp= myapp.main:main", ], },)
安装后,可以通过命令 myapp
直接运行。
6. 高级打包配置
在更复杂的项目中,setup.py
可以通过以下参数进行进一步优化:
- zip_safe=False:防止将 egg 包压缩为 zip 格式。
- long_description:提供详细的包描述信息。
7. 包含数据文件
除了静态文件,setup.py
还支持包含其他类型文件(如文档、配置文件等),可以通过 package_data
参数指定:
from setuptools import setup, find_packagessetup( name="data-package", version="1.0", packages=find_packages(), package_data={ "": ["*.txt"], "data": ["data/*.dat"], },)
8. 自动搜索 Python 包
find_packages()
函数可以自动搜索项目中的 Python 包,避免手动列出每个包路径:
from setuptools import setup, find_packagessetup( name="auto-find-packages", version="1.0", packages=find_packages("src"),)
9. MANIFEST.in 清单文件
MANIFEST.in 文件用于指定要包含的文件和目录,setup.py
会根据清单生成最终的 egg 包:
MANIFEST.inrecursive-include static/
10. 发布到 PyPI
要将包发布到 Python 包索引(PyPI),需要:
setup.py sdist bdist_egg
生成打包文件。twine upload
命令发布到 PyPI。11. 开发模式安装
使用 setup.py develop
命令,包会创建符号链接,而不是复制文件,方便开发和调试:
python setup.py develop
安装后,修改会自动反映到 site-packages
目录。
12. 卸载和重新安装
卸载现有版本并安装最新版本:
python setup.py uninstall
13. 示例项目
以下是一个完整的示例项目,展示了如何使用 setutils 创建和发布一个功能丰富的 Python 包:
from setuptools import setup, find_packages, Commandfrom setuptools.command import installclass InstallCommand(Command): def run(self, *args): self.execute("python setup.py install", "") print("安装完成!")setup( name="myapp", version="1.0", packages=find_packages("src"), include_package_data=True, install_requires=[ "requests>=2.26.0", "pandas>=1.5.0", ], cmdclass=["install"] = InstallCommand,)
总结
setutils 是 Python 打包和分发的强大工具,它简化了包的创建和管理流程,支持依赖管理、清单文件、命令行工具注册等功能。通过合理使用 setutils,开发者可以创建高质量、易于安装和分发的 Python 包。
发表评论
最新留言
关于作者
