Conda搜索最老版本的numpy,受限于Python版本

Conda search for the oldest version of numpy, constrained by Python version

我想在最旧版本的 Numpy 中进行单元测试,这样我就知道代码库是否能在尽可能多的 Numpy 版本中工作。

我正在通过 conda 安装 numpy,并在 Python 的多个版本中进行测试。但是,在 conda 中,不同版本的 Python 每个版本都有不同的 numpy 版本子集可供使用。

对于给定的 python 版本,有没有一种简单的方法可以找到 conda 上可用的 numpy 版本,以及其中最低的版本?

首先,我们需要获取完整的版本列表

假设我们想要获取最早可用的numpy版本python 3.2,那么我们可以像这样设置参数。

PACKAGE=numpy
PYTHON_VERSION=3.2

我们可以通过获取以该包作为其全名 conda search --canonical -f "$PACKAGE" 的规范搜索结果集,并使用 sed 搜索具有正确 python 版本号。规范包名称 follow the format name-version-buildstring 和 buildstring 应该在某处包含 python 版本,尽管格式为 py32 版本 3.2 等。因此我们需要搜索 py${PYTHON_VERSION/./},其中版本号中的.已被删除。

完整的搜索词应该是^$PACKAGE-\([^-]*\)-.*py${PYTHON_VERSION/./}.*,我们感兴趣的是版本号,就是捕获的组。

除了提取版本号,我们还需要remove the lines which are not matched by the search,这里是用-n开头,p结尾的[=14] =]命令。

使用以下代码行,我们可以获得给定 python 版本可用的软件包版本的完整列表:

conda search --canonical -f "$PACKAGE" | \
    sed -n "s/^$PACKAGE-\([^-]*\)-.*py${PYTHON_VERSION/./}.*//p" | \
    sort -Vu

如果您没有可用于排序的 -V 标志,here is an alternative solution。也就是说,无论如何,conda search 提供的列表应该按版本号排序,并且 -V 标志是为了以防万一。需要 -u 标志来确保输出是唯一的,因为可能有多个构建具有相同的包版本和 python 版本。

由于输出的列表是按版本号升序排列的,第一个条目是最低可用版本,可以用head -1.

conda search --canonical -f "$PACKAGE" | \
    sed -n "s/^$PACKAGE-\([^-]*\)-.*py${PYTHON_VERSION/./}.*//p" | \
    sort -Vu | \
    head -1

我们完成了。这应该适用于任何 PACKAGE 和 PYTHON_VERSION 组合。

注: Conda 确实警告 build string is subject to change and should net be relied upon to extract meaningful information。因此,此解决方案将来可能会失效。