Python包开发中不同setup.py写法的差异及选型咨询
两种setup.py写法的核心差异
两者本质是适用场景不同的两套构建体系:
- 第一种是标准setuptools原生方案:
基于官方setuptools库的原生setup函数和find_packages工具开发,是Python包分发的通用基础方案,写法为声明式配置,逻辑简单,专门为无编译需求的纯Python包设计,不需要处理复杂的系统依赖适配。对应代码就是你给出的简洁版本:from setuptools import setup, find_packages setup(name='mypackage', version='0.1', packages=find_packages() ) - 第二种是numpy.distutils扩展方案:
这是numpy为了适配科学计算包的编译需求,在setuptools基础上封装的扩展构建体系,Scipy这类包含大量C/Fortran扩展、需要对接BLAS/LAPACK等系统级数值依赖的包才会用到,和标准方案的核心区别有3点:- 用
Configuration对象管理配置,支持批量添加子包、编译目标、数据文件,降低多子包大型项目的配置成本 - 内置系统依赖探测能力,示例中的
get_info("lapack_opt")就是自动探测本机LAPACK库的路径、编译参数,不需要开发者手动适配不同平台的依赖位置 - 使用numpy重写的
setup函数,会自动处理扩展编译的平台适配、编译链参数配置,是标准setuptools功能的超集
- 用
自有包的写法选型建议
你只需要根据自己的包的属性判断即可:
- 如果你开发的是普通纯Python包,没有需要编译的C/C++/Fortran扩展,也不需要做复杂的系统依赖探测,直接选择第一种标准setuptools写法即可,当前更推荐配合
pyproject.toml做全声明式配置,甚至可以完全不用编写setup.py文件 - 只有当你开发的是数值计算类包,需要编译Fortran/C扩展,且要对接BLAS/LAPACK这类科学计算系统依赖时,才需要用到第二种基于numpy.distutils的写法,普通业务场景完全没必要引入额外的复杂度
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

