如何用星号版本规则安装Python包开发版并适配配置文件
这个问题我之前也碰到过,核心原因是pip默认的版本匹配规则不会包含预发布版本,而setuptools_scm生成的0.2.dev0+gebdc597这类属于PEP 440定义的预发布版本,直接用==0.2.*是匹配不到的。下面给出兼容pip和setuptools的解决方案:
一、理解为什么==0.2.*失败
根据PEP 440规范,==x.y.*等价于>=x.y.0, <x.(y+1).0,它只会匹配正式发布版本(比如0.2.0、0.2.1),完全不包含带dev、a(alpha)、b(beta)后缀的预发布版本。这就是你执行pip install my-package==0.2.*找不到版本的原因。
二、直接安装开发版本的正确命令
要让pip识别并安装预发布版本,你需要结合--pre参数,再用PEP 440兼容的范围匹配语法:
方式1:用范围明确指定
pip install --pre "my-package>=0.2.dev0,<0.3"
这个写法会匹配所有0.2.x系列的开发版本(包括0.2.dev0+gebdc597、0.2.dev1+gxxxxxx等),同时不会匹配0.3.0及以上的正式版。
方式2:用~=近似版本运算符(更简洁)
pip install --pre "my-package~=0.2.dev"
~=0.2.dev的效果和上面的范围一致,它会匹配所有以0.2.dev开头的版本,直到0.3.0正式版发布。
注意:
--pre参数是必须的,除非你的pip配置默认包含预发布版本(一般不推荐全局开启)。
三、在requirements.txt中的写法
和命令行写法完全一致,直接把范围规则写进去即可:
# 写法1:明确范围 my-package>=0.2.dev0,<0.3 # 写法2:近似版本 my-package~=0.2.dev
如果你的环境需要强制安装预发布版本,可以在安装时加上--pre参数:
pip install --pre -r requirements.txt
四、在setup.py/install_requires中的写法
setuptools完全遵循PEP 440规范,所以写法和requirements.txt完全一致,无需额外处理:
from setuptools import setup setup( name="your-package", version="0.1.0", install_requires=[ # 二选一即可 "my-package>=0.2.dev0,<0.3", # "my-package~=0.2.dev", ], )
这样无论是用pip安装你的包,还是用setuptools构建,版本匹配逻辑都是统一的。
额外技巧:直接从Git仓库安装开发版
如果你的包托管在Git仓库(比如GitHub),也可以直接安装最新的开发分支版本,这种方式无需依赖PyPI上的预发布包:
pip install git+https://github.com/your-username/your-repo.git@main#egg=my-package
这个写法也可以直接放到requirements.txt或install_requires中,适合内部开发场景。
内容的提问来源于stack exchange,提问作者xliiv

