如何在setup.py中配置让pip安装依赖时自动对protobuf使用--no-binary参数
首先明确pip的设计限制:install_requires仅支持声明依赖的包名和版本约束,无法直接传递pip安装参数;且预编译的.whl包元数据中没有存储pip安装参数的位置,无法在用户安装whl时自动触发带--no-binary参数的protobuf安装。以下是不同场景下的可行方案:
场景1:分发源码包(.tar.gz格式,可实现自动安装符合要求的protobuf)
方案A:使用现代pyproject.toml配置(适配pip 21.3及以上版本)
在项目根目录的pyproject.toml中添加如下配置即可:
# 声明依赖 [project] dependencies = [ "protobuf>=你需要的最低版本号" ] # 配置pip安装参数 [tool.pip] no-binary = ["protobuf"]
用户直接执行pip install 你的源码包.tar.gz时,会自动遵循配置从源码编译安装protobuf。
方案B:自定义setup.py的安装命令(兼容传统setuptools打包方式)
修改你的setup.py,重写默认的install安装逻辑:
from setuptools import setup from setuptools.command.install import install import subprocess import sys class CustomInstall(install): def run(self): # 优先执行带参数的protobuf安装 subprocess.check_call([ sys.executable, "-m", "pip", "install", "protobuf", "--no-binary=protobuf" ]) # 执行剩余常规安装流程 super().run() setup( name="你的包名", version="你的版本号", install_requires=[ "protobuf>=你需要的最低版本号" ], cmdclass={ "install": CustomInstall }, # 其余你的原有setup配置 )
场景2:必须分发whl包的替代方案
如果只能提供whl包给用户,可以选择以下两种方式实现需求:
- 提前告知用户安装时添加对应参数,执行命令如下:
pip install 你的包.whl --no-binary=protobuf - 告知用户安装前先设置pip环境变量,后续安装会自动生效:
# Linux/macOS export PIP_NO_BINARY=protobuf # Windows cmd set PIP_NO_BINARY=protobuf pip install 你的包.whl
内容的提问来源于stack exchange,提问作者Amir Afianian
相关产品推荐
相关产品推荐

