You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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
    

两种方案效果完全一致,选你觉得顺手的就行。

额外注意事项

  1. 确保mypy、mypyc相关依赖已经在pyproject.toml的build-system.requires中声明(你的现有配置已经满足,无需修改)。
  2. 上传PyPI时,建议只上传通用的py3-none-any.whl和源码包tar.gz,平台特定的编译版wheel自己本地使用即可——纯Python版本的兼容性更好,能覆盖更多用户环境。

备注:内容来源于stack exchange,提问作者Death_by_Ch0colate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:03:05