首先,我们需要获取完整的版本列表
假设我们要获取python 3.2下numpy的最早可用版本,那么我们可以这样设置参数。
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 在sed 命令的末尾完成的。
通过以下代码行,我们可以获得给定 python 版本可用的包版本的完整列表:
conda search --canonical -f "$PACKAGE" | \
sed -n "s/^$PACKAGE-\([^-]*\)-.*py${PYTHON_VERSION/./}.*/\1/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/./}.*/\1/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。因此,该解决方案将来可能会失效。