如何为Python项目实现两种不同构建:一种用于PyPI上传,另一种用于本地mypycify优化
如何为Python项目实现两种不同构建:一种用于PyPI上传,另一种用于本地mypycify优化
不用维护两个setup.py文件,我们可以通过环境变量或者命令行参数动态控制是否启用mypycify编译,一个配置就能搞定两种构建需求。下面是两个最实用的方案:
方案一:用环境变量控制构建模式
这是最简单直接的方法,仅需修改setup.py,让它根据环境变量判断是否开启mypyc优化:
#!/usr/bin/env python import os from glob import glob from mypyc.build import mypycify from setuptools import find_packages, setup paths: list[str] = glob("package_name/**.py") paths += glob("package_name/src/**.py") # 基础构建配置 setup_config = { "packages": find_packages(exclude=["*tests*"]), } # 检查是否开启mypyc编译的环境变量 if os.environ.get("MYPYC_BUILD") == "1": setup_config["ext_modules"] = mypycify(paths) setup(**setup_config)
使用方法:
- 本地优化构建(生成平台特定的编译版wheel):
MYPYC_BUILD=1 python3 -m build - PyPI上传构建(生成通用的纯Python版wheel):
python3 -m build
这个方案零额外维护成本,团队成员一眼就能理解切换逻辑,非常适合日常开发使用。
方案二:用命令行参数控制(可选进阶)
如果你更习惯用命令行参数触发模式切换,可以修改setup.py解析自定义参数:
#!/usr/bin/env python import sys from glob import glob from mypyc.build import mypycify from setuptools import find_packages, setup paths: list[str] = glob("package_name/**.py") paths += glob("package_name/src/**.py") # 基础构建配置 setup_config = { "packages": find_packages(exclude=["*tests*"]), } # 检查命令行是否携带mypyc构建参数 if "--mypyc-build" in sys.argv: setup_config["ext_modules"] = mypycify(paths) # 移除自定义参数,避免干扰setuptools的参数解析 sys.argv.remove("--mypyc-build") setup(**setup_config)
使用方法:
- 本地优化构建:
python3 -m build --mypyc-build - PyPI上传构建:
python3 -m build
两种方案效果完全一致,选你觉得顺手的就行。
额外注意事项
- 确保
mypy、mypyc相关依赖已经在pyproject.toml的build-system.requires中声明(你的现有配置已经满足,无需修改)。 - 上传PyPI时,建议只上传通用的
py3-none-any.whl和源码包tar.gz,平台特定的编译版wheel自己本地使用即可——纯Python版本的兼容性更好,能覆盖更多用户环境。
备注:内容来源于stack exchange,提问作者Death_by_Ch0colate
相关产品推荐
相关产品推荐

